Tôi đang viết một ứng dụng webapp JS. Người dùng có thể chỉnh sửa danh sách/cây của các mục văn bản (ví dụ: danh sách việc cần làm hoặc ghi chú). Tôi thao tác DOM với jQuery rất nhiều.Làm thế nào để tránh mã trùng lặp khi hoạt động trên DOM theo hướng "lên" và "xuống"?
Người dùng có thể điều hướng danh sách lên và xuống bằng bàn phím (tương tự như phím J/K trong Gmail) và thực hiện một số thao tác khác. Nhiều hoạt động trong số này có chức năng phản chiếu "up"/"down", ví dụ:
$.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);
// ....
}
Bây giờ mô hình này có hai chức năng gần như giống hệt được lặp lại ở một số nơi trong mã của tôi bởi vì có rất nhiều hoạt động thuộc danh mục/cây các mặt hàng được khá nhiều đối xứng.
CÂU HỎI: Làm cách nào để refactor thanh lịch này để tránh trùng lặp mã?
Cách tầm thường tôi đã đưa ra cho đến nay là sử dụng .apply() ...
$.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 ]);
// ...
};
Lợi ích là dễ dàng bảo trì khi cấu trúc của các yếu tố khác của mã đòi hỏi phải thay đổi moveUp/moveDown. Tôi đã cần phải thay đổi một chút mã nhiều lần, và tôi luôn luôn cần phải nhớ rằng tôi cần phải làm điều đó ở hai nơi ...
Nhưng tôi không hài lòng với phiên bản "thống nhất", bởi vì:
- Triển khai phức tạp hơn di chuyển đơn giản/di chuyểnDown, do đó trong tương lai nó có thể KHÔNG dễ dàng để duy trì sau đó. Tôi thích mã đơn giản. Tất cả các tham số này, các phép toán ba giây, các thủ thuật .apply() trong mọi hàm được cho là đi "lên" và "xuống" ...
- Không chắc chắn nếu nó an toàn để tham khảo các hàm jQuery.fn. * Một cách rõ ràng (sau khi tất cả chúng được cho là được sử dụng bằng cách áp dụng chúng cho đối tượng jQuery $ ('...'). *)
Làm thế nào để bạn giải quyết các tình huống "hầu như giống hệt mã" khi làm việc với DOM hoặc cấu trúc tương tự?
BTW hugomg