Erstens gibt es drei Ergebnisse Ihre Funktion habe: nichts tun, this.close()
anrufen oder this.open()
anrufen. Im Idealfall wird die resultierende Funktion nur eine if-Anweisung haben, die bestimmt, welches Ergebnis verwendet wird.
Der nächste Schritt besteht darin, den gesamten booleschen Code in Variablen zu extrahieren. ZB var leftPastCenter = this.content.getBoundingClientRect().left > viewport/2
.
Schließlich verwenden Sie boolesche Logik, um es Schritt für Schritt zu vereinfachen.
Hier ist, wie ich es tat:
Zunächst extrahieren alle Booleschen Variablen:
function() {
var duration = +new Date() - start.time,
isPastHalf = Number(duration) < 250 && Math.abs(delta.x) > 20 || Math.abs(delta.x) > viewport/2,
direction = delta.x < 0,
leftPastCenter = this.content.getBoundingClientRect().left > viewport/2,
positiveDelta = this.isEmpty(delta) || delta.x > 0,
isPulled = pulled === true; // I'll assume the test is needed rather than just using pulled.
if (!isScrolling) {
if (isPastHalf) {
if (direction) {
this.close();
} else {
if (leftPastCenter && isPulled) {
this.close();
return;
}
this.open();
}
} else {
if (leftPastCenter) {
if (positiveDelta) {
this.close();
return;
}
this.open();
return;
}
this.close();
}
}
}
Der einfachste realisierenden Teil zu ziehen, wenn isScrolling
wahr ist, geschieht nichts jemals zuvor. Dies wird sofort von einer Ebene der Verschachtelung befreien:
// above same
if (isScrolling) { return; }
if (isPastHalf) {
if (direction) {
this.close();
} else {
if (leftPastCenter && isPulled) {
this.close();
return;
}
this.open();
}
} else {
if (leftPastCenter) {
if (positiveDelta) {
this.close();
return;
}
this.open();
return;
}
this.close();
}
}
in den Fällen sehen nun this.open()
genannt werden. Wenn isPastHalf
wahr ist, wird this.open()
nur aufgerufen, wenn !direction
und !(leftPastCenter && isPulled)
.Wenn isPastHalf
falsch ist, dann wird this.open()
nur aufgerufen, wenn leftPastCenter
und !positiveDelta
:
// above same
if (isScrolling) { return; }
if (isPastHalf) {
if (!direction && !(leftPastCenter && isPulled)) {
this.open();
} else {
this.close();
}
} else {
if (leftPastCenter && !positiveDelta) {
this.open();
} else {
this.close();
}
}
die ifs Flipping (so this.close()
kommt zuerst), der Code ein wenig sauberer macht, und gibt meine letzte Version:
function() {
var duration = +new Date() - start.time,
isPastHalf = Number(duration) < 250 && Math.abs(delta.x) > 20 || Math.abs(delta.x) > viewport/2,
direction = delta.x < 0,
leftPastCenter = this.content.getBoundingClientRect().left > viewport/2,
positiveDelta = this.isEmpty(delta) || delta.x > 0,
isPulled = pulled === true; // I'll assume the test is needed rather than just using pulled.
if (isScrolling) { return; }
if (isPastHalf) {
if (direction || (leftPastCenter && isPulled)) {
this.close();
} else {
this.open();
}
} else {
if (!leftPastCenter || positiveDelta) {
this.close();
} else {
this.open();
}
}
}
Es ist schwierig für mich, mehr zu tun, ohne Ihre Codebasis zu kennen. Eine Sache zu beachten ist direction
und meine neue Variable positiveDelta
sind fast identisch - Sie könnten positiveDelta
entfernen und einfach direction
verwenden. Auch direction
ist kein guter Name für einen Boolean, etwas wie movingLeft
wäre besser.
Was gibt diesen Fehler? – marekful
Ernsthaft? Verwenden Sie keine geschachtelten 'if's. Richten Sie Verantwortlichkeiten nach dem Prinzip der einfachen Verantwortung aus. Ein Stück Code (ein Modul) sollte nur eine Sache machen und es sollte es gut machen. Denken Sie nur daran, wie viele mögliche Ausführungspfade diese hässlichen If-Struts erzeugen ... – Powerslave
Haben Sie den Code @Powerslave gelesen? Wie bricht dies SRP? – Joe