5

Smalltalk (đặc biệt là Squeak/Pharo) có một số dạng hàm variadic không?Chức năng biến thể Smalltalk

Tôi vừa mới đọc về sức mạnh của việc thiết kế các biểu đồ kiểm soát của riêng bạn trong smalltalk và trong khi tôi là một fan hâm mộ lớn của ifTrue: ifFalse: Tôi đang gặp khó khăn để có một cách tốt để thực hiện tùy ý nếu, nếu nếu không, nếu có, ..., các câu lệnh khác sẽ suy nghĩ về cách các hàm Variadic hữu ích hoạt động như thế nào để thực hiện các câu lệnh case. Một cái gì đó như

lớp sai

ifTrue: aBlock (... elseIf: aBoolean then: aSecondBlock ...) else: aLastBlock 

vArgList pairsDo: [:x :y| x ifTrue:[^ (y value)] ]. 
^ aLastBlock 

Trả lời

1

Bạn có thể sử dụng thông điệp #caseOf:otherwise:. Tìm một số người gửi tin nhắn này cho một số ví dụ.

Nhưng dù sao, nếu bạn muốn sử dụng tuyên bố trường hợp, bạn không theo dõi những cách nhỏ nhặt. Hãy cho chúng tôi biết những gì bạn muốn đạt được với tuyên bố về trường hợp của bạn để chúng tôi có thể cho bạn thấy một số cách rõ ràng hơn để làm điều đó.

+0

Là một nguyên tắc chung, tôi đồng ý. Thật khó cho tôi để xem làm thế nào người ta có thể cải thiện, dễ đọc, khôn ngoan, về việc sử dụng #caseOf của Andreas Raab: nếu không: trong DnsClient (trên SqueakSource). –

3

cú pháp từ khóa như Smalltalk cho phương pháp gọi vốn đã xác định arity của phương pháp. Không có mẫu &rest như trong Common Lisp.

Bạn có thể có một phương pháp lấy danh sách, chẳng hạn như BlockClosure>>valueWithArguments: nhưng điều đó hầu như không giống nhau.

Bạn có thể sửa đổi Compiler để hỗ trợ các cuộc gọi phương thức variadic. Có lẽ cuộc gọi sẽ chỉ cần có with: giữa mỗi người trong số các biến:

(điều kiện) ifTrue: aBlock elseif: aBoolean với: aSecondBlock với: anotherBoolean với: aThirdBlock

+0

Bạn không thể sửa đổi chỉ trình biên dịch cho điều đó. Bạn cũng cần phải sửa đổi VM. Vì số lượng đối số nằm trong BlockClosure cho biết kích thước (bao gồm số lượng arg) của ngữ cảnh được tạo. – mathk

1

Một trong những điều tôi đã học được trong lập trình không phải là bạn không cần báo cáo trường hợp, bạn không muốn tuyên bố trường hợp.

Tuyên bố trường hợp là cách để làm nổi bật đối tượng. Khi bạn sử dụng nó, bạn đang giảm bảo trì. Bạn sẽ có tất cả các khả năng mà bạn muốn vào thời điểm đó, nhưng ngày bạn muốn thêm một cái gì đó bạn sẽ phải xem lại mã khó chịu khi bạn không nhớ nữa sự tinh tế trong trách nhiệm của đối tượng đó, vì vậy bạn sẽ sưng lên nó nhiều hơn nữa.

Trong thời gian rất ngắn, họ trông thân thiện nhưng báo cáo trường hợp không phải là bạn của bạn. Họ sẽ cắn bạn trong thời gian dài.

Ngoài ra, mã làm cho mã của bạn kém linh hoạt hơn. Ví dụ: bạn không thể thêm trường hợp một cách tự tin về mã trước đó. Bạn bị buộc phải xem lại mã cũ khi bạn không còn nhớ mã đó nữa vì sao nó được mã hóa như thế.

Trường hợp phát biểu là kẻ thù có mã tốt.

Nếu bạn có thứ gì đó vượt xa ifTrue: ifFalse: thì điều đúng đắn cần làm là tạo trạng thái cho điều đó. Vì vậy, những gì bạn làm là để thực hiện ba lớp học rất đơn giản và tất cả họ hiểu một số động từ.

Nói, # doTheNextThing. Vì vậy, khi đối tượng nhận được thông điệp nó đại diện cho nhà nước (tùy thuộc vào cái nào trong số 3 (hoặc 30, vì vậy hãy lưu ý độ phức tạp này một cách độc đáo)) và trạng thái biết cách làm cho bộ thu ban đầu phản ứng chính xác.

Điều đó sẽ để mã của bạn nhẹ, rõ ràng và có thể bảo trì cao.Bạn sẽ có thể quên điều đó bởi vì bạn biết rằng khi bạn nhìn vào nó một lần nữa, mọi thứ hiển nhiên đến nỗi bạn không cần phải suy nghĩ trong quá khứ mã của bạn nhiều như trong tương lai của mã của bạn.

Điều quan trọng vì bộ nhớ của bạn là bộ nhớ đắt nhất bạn có và AFAIK không thể nâng cấp. Vì vậy, kỹ thuật này cho phép bạn làm những thứ mạnh mẽ hơn.

Bên cạnh đó, làm cho 3 lớp học có vẻ giống như nhiều công việc cho một số nhưng không. Bất kỳ noob có thể thêm 3 lớp trống trong nháy mắt nhưng chỉ có chuyên gia phù hợp mới nhớ được câu lệnh trường hợp trong mã cũ đã được tạo ra như thế nào. Và nếu bạn cực kỳ lạc quan, sẽ mất vài phút để nhớ lại điều đó để bạn biết phải làm gì tiếp theo. Nghĩ về điều đó.

Các vấn đề liên quan