Tập hợp thực hiện các giá trị cụ thể so với sử dụng một số loại tập hợp chung với kiểm tra nâng cao


8

Tôi hiện đang làm việc trên một triển khai thiết lập trong JavaScript. Đây là loại mô phỏng tổng quát như được biết từ Java hoặc C #. Tôi cần một phiên bản có thể thay đổi của điều đó (cho phép thêm / xóa các giá trị đã đặt) và một phiên bản không thay đổi.

Chữ ký nhà xây dựng của tôi trông như thế này:

new GenericSet( 'number', [ 10, 20, 30 ] );

,

 // mutable set of mixed values (allows to add further values via "add")
 new MutableGenericSet( '*', [ 'foo', 42, {}, /./ ] );

hoặc là

// DataValues.prototype.equals will be used by the set for determining equality.
new GenericSet( { type: DataValue, valueComparison: 'equals' }, [ dv1, dv2, dv3 ] );

Chỉ cần cài đặt chung hoặc thực hiện một bộ cho mỗi loại?

Ban đầu, mục đích chính của tôi cho việc này là có các bộ giá trị của một loại. Ví dụ: DataValuesset chỉ chấp nhận Giá trị dữ liệu. Sau đó tôi có thể định nghĩa các giao diện với các hàm yêu cầu một cá thể DataValuesset . Tôi không thể sử dụng thừa kế (và đoán đó sẽ là xấu dù sao đi nữa), vì vậy tôi sẽ sử dụng thành phần và có một GenericSet / MutableGenericSet dụ trong nội bộ.

Một cách tiếp cận khác là luôn luôn sử dụng Genericset và triển khai và sử dụng GenericSet.requireSetOfType( type ), điều này sẽ gây ra lỗi nếu loại của tập hợp không phải là yêu cầu. Mối quan tâm của tôi khi làm theo cách này là các định nghĩa giao diện của tôi sẽ trông ít rõ ràng hơn.

Lấy

/**
 * @param DataValuesSet dataValues
 */
function printDataValues( dataValues ) {
    if( !( dataValues instanceof DataValuesSet ) ) {
        throw Error( '...' );
    }
    // ...
}

so với

/**
 * @param GenericSet<DataValue>
 */
function printDataValues( dataValues ) {
    // Throws error if dataValues is not a set or it it is a set with values of wrong type.
    GenericSet.requireSetOfType( dataValues, DataValue );
    // ...
}

có lẽ sử dụng @param GenericSet(DataValues) dataValuesđể làm tài liệu cho sự lựa chọn thứ hai sẽ ổn chứ? Có ai thấy bất kỳ ý nghĩa nào nữa với cách tiếp cận thứ hai hoặc có bất kỳ đề xuất thay thế nào không? Đối với tôi, cái thứ hai trông trực quan hơn và mối quan tâm của tôi với cái thứ nhất là tôi sẽ chỉ tạo thêm chi phí với các nhà xây dựng trong khi tôi không thể thấy bất kỳ lợi thế rõ ràng nào ngay bây giờ.


6
Tại sao thuốc generic lại quan trọng trong một ngôn ngữ như JS được gõ yếu?
Yazad

1
Điều này là không thể đối với một ngôn ngữ như JavaScript, cả hai đều được gõ một cách yếu và động. Chỉ cần sử dụng một biến thể JS được gõ như TypeScript.
vườn

Câu trả lời:


3

Tôi đã từng thử giải quyết các loại vấn đề này bằng JavaScript, vốn chỉ dùng để làm phức tạp việc triển khai ... Chà ... Bất cứ điều gì. Nếu bạn không muốn sử dụng một cái gì đó như Bản in, hãy ghi lại những gì bạn mong đợi. Nếu mọi người bỏ qua tài liệu của bạn, họ vào lãnh thổ chưa được khám phá.

Đừng cố buộc một cái chốt tròn vào một cái lỗ vuông mà bất cứ ai cũng có thể nặn thành một cái lỗ tròn. Đó là JavaScript. Nắm lấy nó. Đừng đánh nhau, em yêu. Tài liệu về nó, và chỉ cần quay lại viết mã.


0

Tôi muốn nói rằng ví dụ đầu tiên dễ đọc hơn. Nó không có nghĩa là một lỗi được ném cho bộ gõ không chính xác. Nó nói rằng chức năng này mất một DataValueSet. Được rõ ràng trong mã của bạn thêm rõ ràng.

GenericSet.requireSetOfTypelàm xáo trộn ý định kiểm tra loại trong chức năng in. Có vẻ như nó đang kiểm tra các mặt hàng với loại DataValue.


Khả năng đọc dường như không phải là một lập luận đủ mạnh cho tôi ở đây. Bạn có thể làm tài liệu hoàn toàn rõ ràng trong cả hai trường hợp bằng cách sử dụng DataValuesSetvs GenericSet<DataValue>. Có lẽ thay vì GenericSet.requireSetOfTypeđặt tên hàm GenericSet.assertSetOfTypehoặc tương tự sẽ thực sự rõ ràng hơn.
Daniel AR Werner

0

Dựa trên các tùy chọn, bạn trình bày, tôi thích giải pháp đầu tiên, vì nó dễ đọc hơn giải pháp thứ hai. Nhưng, nếu bạn thực sự muốn thực hiện một giải pháp kiểu JS, hãy tạo một hàm xây dựng, cho dù các đối tượng có cùng loại hoặc nên là loại hỗn hợp ( MakeStrictCollectionvs MakeMixedCollection). Trong hàm xây dựng, bạn có thể kiểm tra xem loại của mọi thành viên trong bộ sưu tập đã cho của bạn có cùng loại hay không và đưa ra lỗi hoặc trả về một đối tượng từ mỗi hàm tạo, có thuộc tính loại bổ sung "type":"strict"so với "type":"mixed".


Bên cạnh đó:

Bạn nên xem xét nguyên cảo , có thể, những gì bạn đang tìm kiếm. Và có một gói, dường như phù hợp với nhu cầu của bạn có bộ sưu tập chung .


-1 Cho MakeStrictCollection so với MakeMixedCollection. Đối với các ví dụ mã ở trên, printDataValueshàm sẽ thay đổi để xác minh rằng đối tượng đã cho là instanceof StrictCollectionvà kiểu của nó là DataValues. GenericSet.requireSetOfTypecó thể chính xác là như vậy - do đó, đề xuất của bạn dường như chỉ là một chi tiết triển khai cho GenericSetcách tiếp cận.
Daniel AR Werner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.