Piszę klienta WWW JS. Użytkownik może edytować listę/drzewo elementów tekstowych (np. Listę rzeczy do zrobienia lub notatki). Często manipuluję DOM przy użyciu jQuery.Jak uniknąć duplikowania kodu podczas działania w DOM w kierunku "w górę" i "w dół"?
Użytkownik może poruszać się po liście w górę iw dół za pomocą klawiatury (podobnie jak w przypadku klawiszy J/K w Gmailu) i wykonywać kilka innych operacji. Wiele z tych operacji ma funkcję "up"/"down" lustrzanego odbicia, np.
$.fn.moveItemUp = function() {
var prev = this.getPreviousItem();
prev && this.insertBefore(prev);
// there's a bit more code in here, but the idea is pretty simple,
// i.e. move the item up if there's a previous item in the list
}
$.fn.moveItemDown = function() {
var next = this.getNextItem();
next && this.insertAfter(next);
// ....
}
teraz ten wzór ma dwa niemal identyczne funkcje powtarza się w kilku miejscach w moim kodu, ponieważ istnieje wiele operacji na liście/drzewie elementów, które są prawie symetryczne.
PYTANIE: Jak mogę to elegancko zmienić, aby uniknąć powielania kodu?
trywialny sposób wpadłem do tej pory jest .apply użyć() ...
$.fn.moveItem = function(direction) {
var up = direction === 'up',
sibling = up ? this.getPreviousItem() : this.getNextItem(),
func = up ? $.fn.insertBefore : $.fn.insertAfter;
// ...
if (! sibling) { return false; }
func.apply(this, [ sibling ]);
// ...
};
Korzyścią jest łatwiejsze utrzymanie gdy struktura innych elementów kodu wymaga zmiany moveUp/moveDown. Już kilka razy musiałem trochę zmienić kod i zawsze muszę pamiętać, że muszę to zrobić w dwóch miejscach ...
Ale nie jestem zadowolony z wersji "zunifikowanej", ponieważ:
- Implementacja jest bardziej skomplikowana niż proste moveUp/moveDown, dlatego w przyszłości NIE może być tak łatwo utrzymać się później. Lubię prosty kod. Wszystkie te parametry, operacje trójskładnikowe, .apply() robią sztuczki w każdej funkcji, która ma iść "w górę" i "w dół" ...
- Nie wiem, czy można bezpiecznie odwoływać się do funkcji jQuery.fn. * (W końcu powinny być używane przez zastosowanie ich do obiektu jQuery $ ("..."). *)
W jaki sposób rozwiązujesz te "prawie identyczne kody" podczas pracy z DOM lub podobną strukturą?
BTW
hugomg