2012-08-13 9 views
7

Tôi đã làm theo các tiện ích mở rộng GUI và các ví dụ thông báo sử dụng _isEnabled hoặc isEnabled mà không có dấu gạch dưới. Cả hai dường như làm việc để mở rộng hoặc có thể thay thế chức năng hiện có.Sự khác nhau giữa _isEnabled và isEnabled trong Anguilla là gì?

isEnabled

Ví dụ, lớp PowerTools cơ sở (mà dường như không "mở rộng" chức năng hiện có) có:

PowerTools.BaseCommand.prototype.isEnabled = function(selection, pipeline) 
{ 
    var p = this.properties; 

    if (!p.initialized) 
    { 
     this.initialize(); 
    } 

    if (!this.isToolConfigured()) 
    { 
     return false; 
    } 

    if (this.isValidSelection) 
    { 
     return this.isValidSelection(selection, pipeline); 
    } 

    return true; 
}; 

Một công cụ có thể sử dụng lớp cơ sở này và tuyên bố. isValidSelection, ví dụ:

PowerTools.Commands.CountItems.prototype.isValidSelection = 
             function (selection) { ... } 

_isEnabled

01.

Tôi thấy Anguilla sử dụng ._isEnabled cho chức năng hiện có (trong bảng điều khiển của Chrome ở nhiều nơi trong mã). Ví dụ: WhereUsed có:

Tridion.Cme.Commands.WhereUsed.prototype._isAvailable = 
         function WhereUsed$_isAvailable(selection) ... 

Các chức năng riêng tư?

Tôi đã quen thuộc với dấu gạch dưới trước là quy ước đặt tên cho các biến riêng tư. Các hàm _isEnabled và các hàm khác có bắt đầu bằng dấu gạch dưới "riêng tư không?" Nếu vậy, thì

  • Làm thế nào nên chúng tôi mở rộng (thêm chức năng bổ sung để mã hiện) các chức năng này?
  • Làm cách nào để chúng tôi thay thế (không có mã hiện tại chạy, nhưng thay vào đó chúng tôi chạy mã thay vì "ghi đè")?

Tôi giả sử cùng một phương pháp áp dụng cho các chức năng khác bắt đầu bằng dấu gạch dưới như _isAvailable_invoke.

Trả lời

8

Các phương pháp sau đây được kêu gọi một lệnh:

  1. isAvailable
  2. isEnabled
  3. gọi

Các lớp cơ sở cho tất cả các lệnh - Tridion.Core.Command - có một tiêu chuẩn thực hiện các phương pháp này. Đối với hầu hết các phần, việc triển khai mặc định này cho phép mở rộng Lệnh. Họ cũng gọi các phương thức gạch dưới (_isAvailable, _isEnabled và _execute).

Tôi không biết tại sao lệnh CME chỉ ghi đè các phương thức gạch dưới. Có lẽ ai đó nghĩ rằng nó dễ dàng hơn theo cách đó. Chúng nên được xem xét riêng tư (hoặc tương đương với "được bảo vệ" trong C#), vì vậy nó thực sự có vẻ như là một thực tế xấu với tôi.

Sẽ sạch hơn khi thực hiện các phương thức thích hợp (isAvailable, isEnabled và gọi) và sau đó gọi triển khai cơ sở bằng this.callBase. Tuy nhiên, bạn có thể cần phải dừng đường dẫn trong trường hợp này, hoặc cũng ghi đè lên các phương thức gạch dưới, để tránh giá trị trả về của bạn bị ghi đè bởi các phương thức gạch dưới mặc định. Nó phụ thuộc vào lệnh bạn đang thực hiện hoặc mở rộng.

Tóm lại: sử dụng các phương pháp gạch dưới có thể là thực hành không tốt, nhưng việc triển khai Core dường như khiến bạn khó thực hiện điều đó "đúng". Vì vậy, tôi muốn tránh các phương pháp gạch dưới, nhưng không đổ mồ hôi nếu nó trở nên quá khó để làm như vậy.

P.S. isValidSelection là một phương thức PowerTools chỉ tách logic chung mà tất cả chúng cần từ logic cụ thể cho mỗi lệnh.

+0

Điểm tốt trên PowerTools 'isValidSelection. Để quản lý đường ống, chúng ta có đặt nó thành true/false không? Tôi thấy 'pipeline.stop = true;' trong nguồn .js. –

+0

pipeline.stop = true; thực sự có nghĩa là nó không nên tiếp tục các phần mở rộng khác hoặc các phương thức gạch dưới. Sắp xếp "Tôi biết rõ nhất, hãy ngừng tìm câu trả lời khác" –