Có phải là thông thường để sử dụng các lớp một phần để đạt được "mô đun"?


24

Gần đây tôi đã gặp một tình huống trong cơ sở mã của chúng tôi, nơi một nhóm khác đã tạo ra một 'lớp thần' chứa khoảng 800 phương thức, chia thành 135 tệp dưới dạng một lớp.

Tôi hỏi đội khác về điều này. Mặc dù phản ứng ruột của tôi là loại bỏ nó khỏi quỹ đạo, họ khẳng định rằng đó là một thiết kế tốt, một thực tiễn phổ biến và nó thúc đẩy 'mô-đun' và 'dễ thực hiện' vì các nhà phát triển mới có thể hiểu được chức năng mà hầu như không có kiến ​​thức về phần còn lại của hệ thống.

Đây thực sự là một thực tế phổ biến hay trong bất kỳ cách nào là một ý tưởng tốt? Tôi có xu hướng thực hiện các bước ngay lập tức để đưa con thú này xuống (hoặc ít nhất là ngăn nó phát triển hơn nữa) nhưng tôi sẵn sàng tin rằng tôi đã sai.


6
giết nó bằng lửa! Nhưng nghiêm túc, nhóm khác có thể cung cấp bất kỳ trích dẫn cho thực hành phổ biến bị cáo buộc này?
MattDavey

1
Không ai. Tôi chắc chắn họ đang thổi khói nhưng tôi đang cố gắng hết sức trước khi tôi thả búa.
Joshua Smith

Lý do của họ là không làm điều này mọi lúc?
JeffO

3
Yêu cầu họ mô tả, trong một câu, 800 phương thức trên 135 tệp đều có điểm chung với nhau. Có thể trả lời rằng đối với bất kỳ lớp lành mạnh và hợp lý.
Carson63000

3
@ Carson63000 "Nó thực hiện tất cả các chức năng cần thiết của dự án." Có một câu của bạn.
Ryathal

Câu trả lời:


39

Đây không phải là một ý tưởng tốt.

Các lớp một phần tồn tại để giúp người thiết kế mẫu. Sử dụng chúng cho bất kỳ lý do nào khác (và được cho là cho mục đích dự định của họ, nhưng đó là một vấn đề khác) là một ý tưởng tồi, bởi vì nó dẫn đến các lớp cồng kềnh khó đọc và khó hiểu.

Hãy nhìn nó theo cách này: Nếu một lớp thần với 800 phương thức trong một tệp, nơi bạn biết mọi thứ ở đâu, là một điều xấu - và tôi nghĩ mọi người sẽ đồng ý rằng đó là - thì làm sao một lớp thần có 800 phương thức trải rộng trên 135 tệp, nơi bạn không biết nơi mọi thứ có thể là một điều tốt?


1
Tôi hầu hết đồng ý, nhưng tôi nghĩ có thể có một số trường hợp hiếm hoi partialcó thể hữu ích ngay cả khi không tạo mã. Có lẽ khi bạn có một cái gì đó giống như một lớp lồng nhau?
Svick

1
@svick: Các lớp một phần rất thú vị, nhưng thường không cần thiết. Tôi không chắc tại sao việc chia một lớp thành các tệp riêng biệt sẽ hữu ích khi có các lớp lồng nhau. Trừ khi bạn muốn lớp lồng trong tệp vật lý của chính nó. Trong trường hợp đó ... maaaaybe nó ổn. ;)
Thất vọngWithFormsDesigner

5
Đôi khi tôi sử dụng các lớp một phần để triển khai giao diện rõ ràng - đặc biệt là thứ gì đó như System.IConvertible. Bằng cách nào đó có vẻ sạch sẽ hơn là đặt một #region lớn trong lớp của tôi.
MattDavey

1
Nhận xét lớp lồng nhau thực sự là một ý tưởng thực sự tốt, tôi thậm chí không bao giờ nghĩ về điều đó. Mặc dù ... điều đó có liên quan nhiều đến tổ chức, hơn là "tính mô đun"
Sheldon Warkentin

1
"Các lớp một phần tồn tại để giúp người thiết kế biểu mẫu." Nói chung, nhưng tôi sẽ thêm "... và các trình tạo mã khác.". Tôi đồng ý với phần còn lại của câu trả lời của bạn;)
Silas

14

Vì vậy, câu hỏi là:

Đây thực sự là một thực tế phổ biến hay trong bất kỳ cách nào là một ý tưởng tốt?

Trong số các câu trả lời hiện có là một không . Vì vậy, có một vài điều khác tôi có thể kêu gọi về nó như; thậm chí mã thủ tục có thể được tạo thành mô-đun và bao gồm tất cả mọi thứ, nhưng bồn rửa nhà bếp không phải là cách bạn đạt được mô-đun. Mà một lớp khổng lồ chia thành các đảng làm, tất cả cộng lại thành một mớ hỗn độn lớn.

Tuy nhiên, câu hỏi đó là một cá trích đỏ đến phần quan trọng thực sự đã bị bỏ lỡ; vì OP cũng có những điều sau đây để nói về tình huống này:

(...) Trong khi phản ứng ruột của tôi là nuke nó từ quỹ đạo, họ khăng khăng ...

(...) Tôi có xu hướng thực hiện các bước ngay lập tức để hạ bệ con thú này (hoặc ít nhất là ngăn nó phát triển hơn nữa) nhưng tôi sẵn sàng tin rằng mình đã sai.

CHỜ CHÚT!

Đây là một cái gì đó sẽ làm cho sự đơn điệu nói theo nghĩa bóng của tôi rơi vào tách trà tượng trưng của tôi.

Tôi đã từng ở trong những tình huống tương tự và để tôi nói với bạn: ĐỪNG rơi vào sự thôi thúc phải làm như vậy. Chắc chắn, bạn có thể thả Nuke Hammer of Justice vào đội nhưng trước khi làm như vậy, hãy hài hước với câu hỏi hóc búa sau đây:

Điều gì sẽ xảy ra nếu bạn nói với nhóm rằng mã của họ bị hút và tắt đi ?

(... Hoặc một cái gì đó tương tự nhưng ít gây khó chịu hơn, điều đó không thực sự quan trọng bởi vì họ sẽ bị xúc phạm bất kể bạn làm gì nếu bạn quyết định dùng hết sức vào họ)

Tình hình hiện tại với cơ sở mã là gì? Nó có hoạt động không? Sau đó, bạn sẽ có những vấn đề lớn giải thích cho khách hàng của họ rằng mã của họ về cơ bản là rất tệ . Bất kể lý do nào họ có: miễn là nó hoạt động, hầu hết khách hàng không quan tâm đến cách tổ chức mã.

Cũng đặt mình vào vị trí của họ, họ sẽ làm gì? Hãy để tôi giải thích bạn với kết quả rất có thể sau đây:

Thành viên nhóm số 1: "Vì vậy, có anh chàng này nói với chúng tôi rằng chúng tôi đã làm sai trong những năm qua."

Thành viên nhóm # 2 và # 3: "Thật là một thằng ngốc."

Thành viên nhóm có ảnh hưởng số 4: "Đừng lo lắng về điều đó, tôi sẽ chỉ đến gặp ban quản lý và báo cáo đó là một sự quấy rối."

Xem những gì Thành viên nhóm ảnh hưởng số 4 đã làm ở đó? Ông đã đi đến quản lý và giảm nghiệp của bạn trong công ty. Anh ta có thể là người Mỹ gốc Ý, nói với mọi người đừng lo lắng về điều đó, nhưng sau đó tôi sẽ phân biệt chủng tộc về điều đó.

Vẽ đội vi phạm vào một góc với việc cho phép họ thừa nhận rằng họ đã làm sai quá lâu cũng là một ý tưởng tồi và dẫn đến điều tương tự. Bạn sẽ mất sự tôn trọng và một số nghiệp chính trị văn phòng.

Ngay cả khi bạn đã cố gắng để có được một nhóm người đăng nhập vào điều này, để "dạy cho nhóm một bài học", hãy nhớ rằng bạn đang làm điều này với những người khá thông minh, những người dường như đã hoàn thành một số việc. Khi mã sẽ được viết lại / tái cấu trúc / xử lý / bất cứ điều gì xảy ra và các vấn đề phát sinh là bạn sẽ phải chịu trách nhiệm vì bạn là người thông minh nhất .

Nghịch cảnh về những tình huống như thế này chủ yếu là một trò chơi thua / thua vì nó có nguy cơ trở thành một vòng luẩn quẩn của những trò chơi đổ lỗi. Đây là một kết quả tối ưu cho tình huống này. Ngay cả khi bạn giành chiến thắng, bạn đột nhiên trao lại mớ hỗn độn mà người khác đã làm.

Có những cách khác (trưởng thành hơn nhiều)

Tôi đã ở trong một tình huống tương tự một lần, nhưng sau đó tôi đã lấy một mũi tên ở đầu gối. Vì vậy, sau một thời gian với mũi tên thay đổi nghề nghiệp đột ngột đó trong tâm trí tôi, tôi đã nhận được một cuốn sách Lái xe thay đổi kỹ thuật của Terrence Ryan . Nó liệt kê một số mô hình của những người hoài nghi, loại người không hành động theo những ý tưởng tốt. Tất cả đều có khả năng áp dụng trong trường hợp của OP:

  • Người không hiểu biết - Họ thực sự không biết có những cách khác hoặc đơn giản là không hiểu. Các nhà phát triển cơ bản thường phù hợp với thể loại này nhưng không nhất thiết phải như vậy. (Thành thật mà nói: Tôi đã gặp các nhà phát triển cơ sở sẽ sáng hơn thế này.)
  • Đàn - Họ biết các kỹ thuật tốt hơn so với sử dụng các lớp một phần nhưng không biết rằng chúng được cho phép.
  • Người hoài nghi - Họ chỉ muốn tranh luận rằng có một phần lớp tốt hơn ý tưởng của bạn chỉ vì lý do tranh luận. Thật dễ dàng để làm điều đó trong một đám đông thay vì đứng trước đám đông.
  • The Burned - Vì một số lý do kỳ lạ mà họ không muốn tạo ra các lớp mới, rất có thể họ cho rằng nó quá khó.
  • Thời gian khủng hoảng - Họ bận rộn đến mức họ không thể bận tâm sửa mã của mình.
  • Sếp - Họ nghĩ: "Chà nó hoạt động, vậy tại sao phải bận tâm?"
  • Vô lý - Ok, họ hoàn toàn điên rồ.

Cuốn sách tiếp tục với một danh sách các chiến lược, v.v., nhưng trong trường hợp của OP, đó là vấn đề thuyết phục. Đi đầu mạnh mẽ với sự thật về chống mẫu là không đủ.

Nếu bạn muốn tăng chất lượng mã, ít nhất hãy cho nhóm vi phạm cơ hội nhắc lại và khắc phục tình trạng lộn xộn của chính họ . Cá nhân tôi sẽ cố gắng lắc lư họ bằng cách lắng nghe và đặt câu hỏi hàng đầu, để họ kể câu chuyện của họ:

  • Chính xác thì lớp thần của họ đang làm gì?
  • Họ có gặp phải vấn đề gì không? Họ có bất kỳ lỗi? Đề nghị sửa chữa lành mạnh mà không nói với họ để làm như vậy.
  • Nếu bạn là người dùng của lớp thần này dưới dạng API: Có cách nào đơn giản hơn để sử dụng mã hơn là sử dụng toàn bộ không? Đề xuất các ví dụ đơn giản hơn, xem cách họ phản ứng.
  • Bạn có thể chuyển đổi một số chức năng với người khác, mà không phải viết chức năng?
  • Họ có cần được đào tạo không? Bạn có thể thuyết phục ban quản lý cho họ làm điều đó hoặc có các cuộc họp ăn trưa về các mô hình và thực tiễn không?

... và cứ thế. Cung cấp cho họ những gợi ý nhỏ để họ có thể tiến về phía trước. Phải mất thời gian và sẽ cần một số loại mỡ khuỷu tay chính trị văn phòng nhưng kiên nhẫn và chăm chỉ là một đức tính phải không?


Đây là một câu trả lời rất sâu sắc. Nếu bạn là một nhà phát triển mới, bạn cần hiểu điều này. Hầu hết các nhà phát triển có kinh nghiệm nhận ra điều này sau vài năm, một số không bao giờ làm được.
FishySwede

6

Trang Các lớp và Phương thức một phần của MSDN gợi ý hai tình huống sử dụng các lớp một phần:
1. Để tách một lớp khổng lồ thành nhiều tệp riêng biệt.
2. Để có một nơi để đặt mã nguồn được tạo tự động.

2 được sử dụng rất nhiều bởi Visual studio (ví dụ: cho các tệp aspx và cho winforms). Đây là một sử dụng hợp lý của các lớp một phần.

1 là những gì nhóm của bạn đang làm. Tôi sẽ nói rằng sử dụng các lớp một phần là một cách hoàn toàn hợp lý để đạt được tính mô đun khi bạn có các lớp khổng lồ, nhưng bản thân các lớp khổng lồ là không hợp lý. Nói cách khác, có một lớp học khổng lồ là một ý tưởng tồi, nhưng nếu bạn sắp có một lớp học khổng lồ, các lớp một phần là một ý tưởng tốt.

Mặc dù nếu bạn có thể phân chia một lớp một cách thông minh thành các tệp riêng biệt để người dùng khác nhau làm việc, bạn có thể tách nó thành các lớp riêng biệt không?


+1 cho "bạn không thể chia nó thành các lớp riêng biệt chứ?". Đây chính xác là những gì chúng tôi đề xuất. Có vẻ như thông thường rằng nó nên được thực hiện theo cách đó ban đầu.
Joshua Smith

4

Vì vậy, cuối cùng, họ đang thực hiện phát triển thủ tục bình thường mà không có bất kỳ phần OOP nào. Họ có một không gian tên toàn cầu với tất cả các phương thức, biến và không có gì.

Hoặc là thuyết phục họ rằng họ đang làm sai hoặc đưa họ ra khỏi đó.


1

Một lớp tiện ích chứa các phương thức không thể kết hợp hợp lý với các phương thức khác để tạo ra một lớp. Nếu bạn có hơn 800 phương thức, chia thành 135 tệp, có vẻ như ai đó đã quản lý để tìm một số phương thức phổ biến ...

Chỉ vì bạn có một lớp tiện ích, không có nghĩa là bạn không thể có một lớp tiện ích khác.

Ngay cả khi bạn có 800 phương thức chủ yếu không liên quan, giải pháp không phải là một lớp lớn và rất nhiều tệp. Giải pháp là một không gian tên, một số không gian tên phụ và rất nhiều lớp nhỏ. Đây là một công việc nhiều hơn một chút (bạn phải đưa ra một tên cho lớp cũng như phương thức). Nhưng nó sẽ làm cho cuộc sống của bạn dễ dàng hơn khi đến lúc dọn dẹp mớ hỗn độn này, và trong khi đó, nó sẽ làm cho việc sử dụng dễ dàng hơn (nghĩa là dễ dàng hơn để khám phá nơi sử dụng phương pháp này).

Và không, điều này không phổ biến (số lượng tệp nhiều hơn số lượng chức năng miễn phí).


0

Tôi không thích điều này cả. Tuy nhiên, có thể các lớp một phần có ý nghĩa với các nhà phát triển trong quá trình phát triển vì nó cho phép phát triển đồng thời số lượng lớn các phương thức này, đặc biệt nếu không có nhiều sự phụ thuộc giữa chúng.

Một khả năng khác là các lớp bộ phận đó được xây dựng để sửa đổi lớp lõi được tạo tự động. Nếu đây là trường hợp, người ta không nên chạm vào chúng, nếu không, mã tùy chỉnh sẽ bị xóa khi tạo lại.

Tôi không chắc chắn rằng bất cứ ai cũng có thể duy trì điều này một cách dễ dàng mà không cần nghiên cứu. Bây giờ nếu bạn giết nó, số phương thức sẽ không giảm. Số lượng phương pháp và độ phức tạp, với tôi, là vấn đề thực sự. Nếu các phương thức thực sự thuộc về lớp, thì việc có 1 tệp khổng lồ sẽ không giúp cuộc sống của bạn dễ dàng hơn, đặc biệt là trong bảo trì, thực tế, có thể dễ bị lỗi hơn khi phơi bày tất cả mã này cho các lỗi ngớ ngẩn như tìm kiếm thẻ hoang dã và thay thế.

Vì vậy, hãy cẩn thận và biện minh cho quyết định giết. Ngoài ra, xem xét những gì kiểm tra sẽ được yêu cầu.


0

Nó hoàn toàn tốt từ góc độ thiết kế thực tế với giả định 135 tệp thực sự nhóm các phương thức lại với nhau tương tự như những gì các lớp truyền thống sẽ làm. Nó chỉ có trung bình 6 phương thức cho mỗi tệp. Nó chắc chắn không phải là cách phổ biến nhất hoặc truyền thống để thiết kế một dự án. Cố gắng thay đổi nó sẽ chỉ tạo ra một loạt các vấn đề và ý chí xấu không có lợi ích thực sự. Làm cho dự án tuân thủ các tiêu chuẩn OO sẽ tạo ra nhiều vấn đề như nó giải quyết. Đây là một vấn đề hoàn toàn khác nếu nhiều tệp không thực sự cung cấp bất kỳ sự tách biệt có ý nghĩa nào.


3
Tái cấu trúc mã thủ tục thành OO thường có vấn đề đó - Tôi nghĩ rằng việc sửa lỗi này sẽ là một nhiệm vụ to lớn và dạy cho đội ngũ viết mã ngay cả người ôm, trên hết Joshua sẽ bị đổ lỗi cho mọi thứ xảy ra trong năm tới (và hơn thế nữa ) nếu anh ta thuyết phục họ tái cấu trúc. Đây là lý do tại sao không ai từng quá khó khăn để làm các nhà tái cấu trúc như thế này (ít nhất là không một lần họ đã thấy kết quả). Ngoài ra nếu bạn nghĩ rằng đó là một thiết kế tốt - hãy xem lại câu trả lời này sau 5 năm và cho chúng tôi biết bạn nghĩ gì sau đó (Có vẻ như tôi học lại mọi thứ tôi biết về thiết kế cứ sau 5 năm hoặc lâu hơn).
Bill K

@BillK nếu bạn chờ đợi mười năm, những gì bạn biết có thể sẽ là triết lý thiết kế "trong" hiện tại.
Ryathal

Các tệp 135 thường làm các phương pháp liên quan đến nhóm, nhưng điều đó (với tôi) vẫn không làm cho điều này trở thành một ý tưởng tốt. Tôi muốn thử nghiệm hệ thống này nhưng vẫn còn sơ khai / chế nhạo hydra phương pháp 800 sẽ là một nỗi đau xấu xí ở mông.
Joshua Smith

@Ryathal không phải là "trong", đó là những gì bạn nghĩ là thiết kế tốt (vì lý do chính đáng) và sau đó, khi bạn thực hành và cải thiện bạn nhận ra đó không phải là một ý tưởng tốt như bạn nghĩ. Dường như điều đó xảy ra cứ sau 5 năm hoặc một lần, và một khi tôi nhận ra rằng nó phản ứng lại phản hồi của tôi đối với một số ý kiến ​​của mọi người vì tôi nhận ra họ thực sự là những nhà thiết kế xuất sắc, là tất cả chúng ta) trong quá trình cải thiện mãi mãi các hoạt động của chúng ta. Lập trình viên duy nhất tôi lo lắng là một người không nghĩ rằng họ có thể cải thiện mã mà họ đã viết 5 năm trước.
Bill K

0

Ngoài các câu trả lời đã chỉ ra, các lớp một phần có thể hữu ích trong thiết kế lớp, nơi bạn muốn tổ chức chức năng cắt chéo phân cấp lớp của bạn thành các tệp riêng biệt của lớp. Điều này cho phép một người sử dụng trình khám phá giải pháp để điều hướng chức năng mỗi lớp (theo tổ chức tệp) và chế độ xem lớp để điều hướng chức năng theo từng lớp. Tôi muốn sử dụng một ngôn ngữ hỗ trợ mixin và / hoặc các đặc điểm, nhưng các lớp một phần là sự thay thế hợp lý nếu được sử dụng một cách tiết kiệm và không nên thay thế cho thiết kế phân cấp lớp tốt.

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.