Áp dụng các nguyên tắc của Clean Code cho các ngôn ngữ chức năng


16

Tôi hiện đang đọc Bộ luật sạch của Robert Martin . Tôi nghĩ nó thật tuyệt, và khi viết mã OO tôi đang học thuộc lòng anh ấy. Đặc biệt, tôi nghĩ lời khuyên của anh ấy về việc sử dụng các hàm nhỏ với các tên có ý nghĩa làm cho mã của tôi trôi chảy hơn nhiều. Nó được tóm tắt tốt nhất bởi trích dẫn này:

[W] e muốn có thể đọc chương trình như thể nó là một tập hợp các đoạn TO, mỗi đoạn mô tả mức độ trừu tượng hiện tại và tham chiếu các đoạn TO tiếp theo ở cấp độ tiếp theo.

( Clean Code , trang 37: a "TO đoạn" là đoạn bắt đầu bằng một câu được nói ở dạng nguyên bản. "Để thực hiện X, chúng tôi thực hiện các bước Y và Z." "Để làm Y, chúng tôi ...", v.v. ) Ví dụ:

ĐẾN RenderPageWithSetupsAndTeardowns, chúng tôi kiểm tra xem trang đó có phải là trang thử nghiệm hay không và nếu có, chúng tôi bao gồm các thiết lập và phân tích. Trong cả hai trường hợp, chúng tôi kết xuất trang bằng HTML

Tôi cũng viết mã chức năng cho công việc của tôi. Các ví dụ của Martin trong cuốn sách chắc chắn đọc như thể chúng là một tập hợp các đoạn văn và chúng rất rõ ràng - nhưng tôi không chắc chắn rằng "đọc như một đoạn văn" là một chất lượng mong muốn cho mã chức năng có .

Lấy một ví dụ ra khỏi thư viện tiêu chuẩn Haskell :

maximumBy               :: (a -> a -> Ordering) -> [a] -> a
maximumBy _ []          =  error "List.maximumBy: empty list"
maximumBy cmp xs        =  foldl1 maxBy xs
                        where
                           maxBy x y = case cmp x y of
                                       GT -> x
                                       _  -> y

Đó là khoảng cách xa như bạn có thể nhận được từ lời khuyên của Martin, nhưng đó là Haskell ngắn gọn, thành ngữ. Không giống như các ví dụ Java trong cuốn sách của anh ấy, tôi không thể tưởng tượng ra bất kỳ cách nào để cấu trúc lại thứ đó thành một thứ có nhịp mà anh ấy yêu cầu. Tôi nghi ngờ rằng Haskell được viết theo tiêu chuẩn của Clean Code sẽ trở nên dài dòng và không tự nhiên.

Tôi có sai khi xem xét (ít nhất là một số) Mã sạch theo tỷ lệ cược với các thực tiễn tốt nhất về lập trình chức năng không? Có cách nào hợp lý để diễn giải lại những gì anh ta nói trong một mô hình khác không?


1
Các lập trình viên chức năng có xu hướng viết mã quá ngắn gọn, đó là sự thật. Tôi sẽ không từ xa xem xét rằng đó là một thực tiễn tốt nhất, ngay cả trong môi trường đó.
Telastyn

Tha thứ cho sự thiếu hiểu biết, nhưng một đoạn TO là gì?
Shashank Gupta

4
Như đã được đề cập trong một câu hỏi khác gần đây, Dijkstra đã viết về sự ngu ngốc của "lập trình ngôn ngữ tự nhiên" và tôi có xu hướng đồng ý với anh ta rằng mã đọc như văn xuôi là một giấc mơ xa vời. Tôi nghĩ điều này đặc biệt đúng trong Haskell, trong đó, thuần túy, biểu tượng một cách tượng trưng giữa các giá trị thay vì chuỗi các bước để tạo hiệu ứng. Tôi nghĩ rằng điều quan trọng là mã được trích dẫn là thành ngữ. Ví dụ, đây xslà một loại tên xấu nhưng nó phổ biến trong các ngôn ngữ chức năng như iđối với các biến vòng lặp.
Doval

@ShashankGupta Tôi đã chỉnh sửa câu hỏi bằng một liên kết đến trang cụ thể trong cuốn sách cũng như sự hiểu biết của riêng tôi về những gì chú Bob đã viết.

@ShashankGupta Ông đưa ra một vài ví dụ, nhưng ý tưởng là nó nên đọc như văn xuôi. "Để tìm tối đa danh sách, bạn kiểm tra mọi yếu tố ..."
Patrick Collins

Câu trả lời:


11

Clean Code trước hết là một hướng dẫn sử dụng. Strunk and White không áp dụng khi bạn viết bằng Klingon. Ý tưởng là bạn muốn rõ ràng cho các lập trình viên có khả năng sẽ đọc mã của bạn. Bạn muốn có mã được mô đun hóa và dễ dàng cấu trúc lại. Có nhiều cách để làm điều này trong Haskell giống như có nhiều cách để làm điều này trong bất kỳ ngôn ngữ nào khác nhưng các chi tiết chính xác sẽ khác nhau.

Điều đó đang được nói, có một số hướng dẫn phong cách cho Haskell. Stack Overflow cũng có một hướng dẫn khá toàn diện . Giữ logic mã hóa đơn giản và ngắn gọn dường như khá ổn định. Tổng quát hóa các chức năng cũng được nhấn mạnh vì nó dẫn đến tính mô đun. Mã DRY cũng được nhấn mạnh, giống như với Clean Code.

Cuối cùng, các nguyên tắc mã hóa của Clean Code và Haskell cố gắng làm điều tương tự nhưng tiếp tục đi theo con đường riêng của họ để đến đó.


1
Tôi cảm thấy như câu trả lời này giảm giá các nguyên tắc mà Clean Code dạy rất phù hợp với các ngôn ngữ và đó là cốt lõi của câu hỏi được hỏi. Tôi có thể thấy lý do tại sao mọi người nghĩ về Clean Code như một hướng dẫn về phong cách và tôi nghĩ nó đúng một phần, nhưng không đủ đúng để loại bỏ toàn bộ cuốn sách như một.
Allan

Tôi không nghĩ cuốn sách Clean Code của Martin là sách hướng dẫn phong cách. Tôi cảm thấy những lời dạy của cuốn sách thực sự phù hợp ở đâu đó giữa một hướng dẫn phong cách và các mẫu thiết kế.
Michael R

15

Tôi không chắc chắn tôi làm theo những gì bạn muốn nói qua ví dụ của bạn. Đoạn văn, như ông mô tả chúng, không đòi hỏi dài dòng. Anh ta không có nghĩa là mã nên đọc như tiếng Anh. Phần quan trọng là nhóm các chức năng ở cùng một mức độ trừu tượng, trong một tiến trình hợp lý. Đó là một khái niệm cấu trúc lý thuyết vượt qua các mô hình lập trình.

Thể hiện ở định dạng "TO đoạn" của Bob Martin, tôi đọc ví dụ của bạn là:

  • Để tính toán maximumBy , bạn cần một hàm đặt hàng và một danh sách, và kết quả là một phần tử của danh sách đó.
  • Để tính toán maximumBy danh sách trống và bất kỳ chức năng đặt hàng nào cũng là một lỗi.
  • Để tính toán maximumBydanh sách xs, bạn gấp lại danh sách đó bằng maxByhàm.
  • Để tính toán maxBy hai thành phần danh sách, bạn so sánh chúng bằng hàm đặt hàng đã cho. Nếu phần tử đầu tiên lớn hơn, chọn nó. Nếu không thì chọn cái thứ hai.

Bạn đang bắt đầu với các khái niệm chung nhất và tiến tới chi tiết hơn, giống như trong các ví dụ bắt buộc. Ý tưởng của "TO đoạn văn" là bạn có thể ngừng đọc tại một thời điểm nhất định khi bạn đã có đủ chi tiết, mà không phải nhảy lên xuống trang. Đó chắc chắn là trường hợp ở đây.

Một vài cái tên có lẽ tốt hơn, nhưng chúng là những quy ước chung của ngôn ngữ, đặc biệt là khi viết các hàm bậc cao chung. Tên hàm bậc cao cũng không dịch tốt thành các cụm động từ mệnh lệnh như các ví dụ trong sách, vì chúng mô tả nhiều hơn về mối quan hệ giữa các động từ.

Có nhiều cách để thực hiện điều này mà không tuân theo hướng dẫn "ĐẾN đoạn". Bỏ chữ ký loại rõ ràng sẽ bỏ qua câu "tổng quan" cấp cao hơn. Bạn có thể sử dụng biểu thức if để xử lý lỗi thay vì khớp mẫu, điều này sẽ làm sai lệch mức độ không phù hợp với mức độ trừu tượng khác. Bạn có thể nội tuyếnmaxBy như một hàm ẩn danh thay vì đặt cho nó một tên có thể được mô tả chi tiết hơn sau này.

Trên thực tế, tôi nghĩ rằng các cấu trúc như wherethực sự phù hợp hơn với định dạng đoạn văn, bởi vì bạn có thể sử dụng chúng để đặt tên cho một chi tiết sâu hơn theo cách gần với cách chúng ta diễn đạt bằng tiếng Anh và tương tự giới hạn phạm vi của nó trong một cách rõ ràng đến bối cảnh của "đoạn văn."

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.