Hướng dẫn mã hóa: Các phương thức không nên chứa nhiều hơn 7 câu lệnh?


78

Tôi đã xem qua Nguyên tắc mã hóa AvSol cho C # và tôi đồng ý với hầu hết mọi thứ nhưng tôi thực sự tò mò muốn xem người khác nghĩ gì về một quy tắc cụ thể.

AV1500

Các phương thức không được vượt quá 7 câu lệnh Một phương thức yêu cầu nhiều hơn 7 câu lệnh đang làm quá nhiều hoặc có quá nhiều trách nhiệm. Nó cũng đòi hỏi trí óc của con người để phân tích các tuyên bố chính xác để hiểu những gì mã đang làm. Chia nó thành nhiều phương pháp nhỏ và tập trung với tên tự giải thích.

Có phải hầu hết các bạn tuân theo quy tắc này? Ngay cả khi có rất ít được lưu từ việc tạo một phương thức mới (Mã của bạn vẫn DRY ) ngoài khả năng đọc tăng lên đáng kể? Và số của bạn vẫn còn thấp đến 7? Tôi sẽ có xu hướng nhiều hơn về 10.

Tôi không nói rằng tôi vi phạm quy tắc này ở mọi nơi - ngược lại, các phương pháp của tôi nhỏ và tập trung 95% nhưng nói rằng bạn không bao giờ nên vi phạm quy tắc này thực sự đã thổi bay tôi.

Tôi thực sự chỉ muốn biết mọi người nghĩ gì về KHÔNG BAO GIỜ vi phạm quy tắc này (Đó là '1' trên tiêu chuẩn mã hóa - nghĩa là KHÔNG BAO GIỜ làm điều này). Nhưng tôi nghĩ bạn sẽ gặp khó khăn khi tìm một cơ sở mã không.


48
Họ có đếm các casebáo cáo trong một singe switchquá không? Dù sao đi nữa, đó không phải là một yêu cầu ngu ngốc, vô dụng. Những người đã viết nó không biết gì về lập trình.
SK-logic

86
Quy tắc duy nhất phải là '1' trên tiêu chuẩn mã hóa phải là quy tắc "bạn sẽ thực hiện tất cả các nguyên tắc mã hóa bằng một hạt muối".
Mike Nakis

6
@ SK-logic 1027 cũng không tệ - phải viết mã thú vị để xử lý dữ liệu bị thiếu, nếu bạn phải coi chuỗi rỗng bằng với chuỗi rỗng.
quant_dev

25
Khi đọc hướng dẫn này, tôi sẽ thấy một cơ sở mã đầy đủ: void DoS Something () {DoS SomethingFirstSevenLines (); DoS SomethingSecondSevenLines (); DoS SomethingThirdSevenLines (); Vân vân; }
kéo

12
Hãy thử phản ánh hầu hết .NET Framework và xem có bao nhiêu phương thức có ít hơn 7 câu lệnh ...
David Boike

Câu trả lời:


195

Đây là một "mùi tiêu chuẩn" với tôi. Bất cứ khi nào tôi thấy các tiêu chuẩn mã hóa với các giới hạn cụ thể trong đó, tôi lo lắng. Bạn hầu như luôn gặp phải trường hợp một phương thức cần phải lớn hơn tiêu chuẩn cho phép (cho dù đó là độ dài / số dòng, số biến, số điểm thoát, v.v.). Các tiêu chuẩn nên giống như hướng dẫn và cho phép đủ thời gian để thực hiện phán đoán tốt. Đừng hiểu sai ý tôi, thật tốt khi có các tiêu chuẩn, nhưng chúng không nên trở thành "quản lý vi mô bằng proxy".


25
+1 cho "quản lý vi mô bằng proxy." Tôi nghi ngờ rằng ai đó đã đọc về quy tắc "7 cộng hoặc trừ 2" ( en.wikipedia.org/wiki/iêu ) và nhầm lẫn việc lưu giữ thực tế ngắn hạn với lưu trữ dài hạn như, bạn biết đấy, một trình soạn thảo mã.
fluffy

25
Bất kỳ tiêu chuẩn suy nghĩ hợp lý nào đều cấm các số ma thuật trong mã, phải không? Bạn sẽ nghĩ rằng tiêu chuẩn mã hóa cũng sẽ được giữ theo tiêu chuẩn đó. Số 7 chắc chắn có chất lượng "ma thuật" chắc chắn.
Adam Crossland

2
Câu trả lời của bạn sẽ có ý nghĩa hơn nếu tiêu đề của tài liệu không phải là "Mã hóa Guidlinescho C # 3.0 và 4.0.
Andy

+1 Trong suy nghĩ của tôi, lý do duy nhất bạn nên tuân theo các tiêu chuẩn mã hóa là không bao giờ tuân theo một con số tùy ý, nhưng để đảm bảo bạn không gây ra các vấn đề hợp nhất không cần thiết trong kiểm soát phiên bản (nghĩa là các vấn đề liên quan khi bạn làm việc trong một nhóm). Thông thường các tệp ngắn hơn và nhiều thành phần hơn có nghĩa là bạn sẽ ít gặp sự cố hơn khi hợp nhất các thay đổi mã.
Spoike

3
Tôi đã tải xuống tài liệu này và bắt đầu xem qua nó. Trong 1.6, có ghi: "Tài liệu không nêu rõ rằng các dự án phải tuân thủ các nguyên tắc này, cũng không nói hướng dẫn nào quan trọng hơn các hướng dẫn khác. Tuy nhiên, chúng tôi khuyến khích các dự án tự quyết định hướng dẫn nào là quan trọng, dự án sẽ sai lệch gì sử dụng, ai là nhà tư vấn trong trường hợp có nghi ngờ phát sinh, và loại bố cục nào phải được sử dụng cho mã nguồn. " Mặc dù 1 có nghĩa là "Nguyên tắc mà bạn không bao giờ nên bỏ qua và nên áp dụng cho tất cả các giải pháp", bạn có thể chọn sửa đổi nó.
chrish

83

Nó thường là một ý tưởng tốt để chia công cụ thành các phương pháp nhỏ. Nhưng điều quan trọng là phân chia những thứ có ý nghĩa.

Nếu nó không có ý nghĩa để phân chia, thì đừng phân chia. Đây thường là trường hợp đối với một số thủ tục hoặc mã GUI.

Steve McConnell đã nêu trong Code Complete rằng bạn không phải lúc nào cũng năng suất hơn khi sử dụng các phương pháp ngắn. Nếu bạn phân tách khi nó không có ý nghĩa, bạn thêm độ phức tạp vào mã không có lợi.

Như mọi khi với hướng dẫn, thật tốt để nhớ tại sao các ràng buộc tồn tại, vì vậy bạn có thể tìm hiểu khi nó không áp dụng. Trong hầu hết các mã, các phương thức sẽ ngắn hoặc bạn có thể gặp vấn đề với DRY hoặc tách các mối quan tâm . Nhưng nếu không phải vậy, thì tốt thôi.


1
Câu trả lời chính xác. Hai dòng cuối cùng đặc biệt lái xe về nhà điểm.
Xonatron

6
Tôi nghĩ rằng quy tắc quan trọng của ngón tay cái là kiểm tra xem các đối tượng phụ là trực giao. Nếu chúng độc lập, có thể được gọi theo bất kỳ thứ tự nào và tôn trọng sự bất biến của lớp thì tốt hơn là giữ chúng tách biệt. Nếu các phương thức được liên kết chặt chẽ, phá vỡ các bất biến lớp và / hoặc cần được gọi theo một thứ tự nhất định thì có lẽ tốt hơn là giữ chúng lại với nhau.
hugomg

4
Mã hoàn thành là đầy đủ các công cụ tốt. Mỗi lập trình viên nên ăn một miếng của nó vào bữa trưa mỗi ngày.
deadalnix

29

Nó nên được coi là một quy tắc của ngón tay cái.

Những thứ như "Không quá 80 (100.120) cột văn bản", "một điểm thoát cho mỗi phương thức", "không quá 2 cấp độ lồng", là những gì tôi sẽ gọi là ngưỡng cho các chỉ số về mùi mã. Nếu bạn vi phạm chúng đôi khi, điều đó không nhất thiết có nghĩa là mã xấu. Nếu bạn thấy mình vi phạm chúng một cách nhất quán thì có gì đó có mùi trong mã và bạn có thể muốn tạm dừng và suy nghĩ lại về cách tiếp cận của mình.

Đối với tôi, các tiêu chí quan trọng nhất là "Mã này có dễ hiểu không?", "Nó có lặp đi lặp lại không?", "Nó có bị phá vỡ ở những nơi hợp lý không?", "Nó có được ghép lỏng lẻo không?" Có một vài điều nữa, nhưng tôi nghĩ rằng ý tưởng cơ bản có thể được tóm tắt bằng cách ghi nhớ lời khuyên của Donald Knuth: "Các chương trình được con người đọc và chỉ tình cờ cho máy tính thực thi."


7
Giới hạn cột "80/100/120" là để chúng ta có thể đọc mã. Hầu hết các thiết bị đầu cuối mở ở 80 cột và sẽ ít nỗ lực hơn để khiến tác giả gói thành 80 cột so với việc khiến mọi người đọc thay đổi kích thước thiết bị đầu cuối của họ mỗi khi họ muốn đọc mã. Không giống như các giới hạn khác, giới hạn cột N không ảnh hưởng đến ngữ nghĩa của mã, đó là một quy tắc hoàn toàn theo kiểu cách; trong cùng danh mục với "sử dụng tab 4 không gian" hoặc "đặt dấu ngoặc mở cho các chức năng trên dòng riêng của chúng".
Dietrich Epp

4
Cấp, đó là một khía cạnh thẩm mỹ nhiều hơn một khía cạnh ngữ nghĩa. Tuy nhiên, đó là nơi câu cuối cùng của tôi áp dụng. Không có gì lạ khi tìm thấy các câu lệnh Java vượt quá quy tắc cột 80 mà không có vị trí "đẹp" để phân chia dòng. Điều này ảnh hưởng đến khả năng đọc và hiểu mã. Nó cũng có thể chỉ ra hành vi vi phạm Luật Demeter
seggy

7
Vào thế kỷ 21, IDE của tôi có tính năng này được gọi là "gói từ động".
Gyorgy Andottok

9
@ GyörgyAndrasek: Nhưng mọi người không phải lúc nào cũng sử dụng IDE của bạn: chúng tôi xem mã trong GitHub, trong các thiết bị đầu cuối có less, trong vimemacs; và gói tự động có vẻ hỗn loạn ở tốt nhất. Các tiêu chuẩn mã hóa không vì lợi ích của bạn, chúng là vì lợi ích của những người làm việc theo nhóm.
Dietrich Epp

2
@DietrichEpp Cá nhân tôi gặp khó khăn khi đọc mã luôn được gói ở cột 80. Gần đây tôi đã phải làm việc với một dự án Java nơi sử dụng công cụ định dạng Eclipse tiêu chuẩn. Và bên trong một phương thức, rất khó để theo dõi các dòng đã đi qua hai hoặc thậm chí ba dòng (tôi cũng đổ lỗi cho các cài đặt định dạng khác cho điều đó). Điểm mấu chốt là tôi nghĩ rằng 80 là một chút lỗi thời. Cá nhân tôi sử dụng giới hạn 120, các trình chỉnh sửa của tôi được đặt để thực thi điều đó, có một bàn điều khiển rộng 120 cột và Github thực sự hiển thị 125 cột. Và tôi nghĩ nó dễ đọc hơn như thế.
chọc

18

Tôi chưa bao giờ dành thời gian để thực sự đếm số lượng câu lệnh trong các phương thức của mình, nhưng tôi cố gắng viết các phương thức thực hiện sạch sẽ một mục đích rõ ràng. Miễn là mã của bạn sạch sẽ, có thể đọc được và tuân theo các nguyên tắc DRYTrách nhiệm duy nhất , có lẽ bạn đã hoàn thành công việc của mình. Tôi nghĩ rằng việc phân tách một phương thức một cách tùy tiện chỉ để thực thi giới hạn bảy câu lệnh có thể làm cho mã của bạn không thể đọc / duy trì được.


1
+1 cho khả năng đọc. Nó thậm chí không quan trọng nếu một phương thức dài 20, 30 hoặc thậm chí 50 dòng. Nếu DRY và SRP là mục tiêu của bạn, sẽ không có vấn đề gì nếu các phương thức có vẻ hơi khó hiểu ... mặc dù thường thì bạn sẽ thấy rằng bạn càng cố gắng tạo mã, thì phương thức của bạn càng ngắn sẽ tự nhiên trở thành.
S.Robins

11

Nó gần đúng

Những loại quy tắc không nên được thực hiện quá theo nghĩa đen. Họ có thể đã nói " phương pháp nên ngắn ". Tuy nhiên, một số người sẽ hiểu rằng "ít nhất 1 trang" và những người khác là "tối đa 2 dòng".

Tôi cho rằng họ đã nói "7 tuyên bố" để cho bạn một ý tưởng sơ bộ (mặc dù tôi nghĩ họ nên nói "khoảng 7"). Nếu bạn cần 9 lần một lần, đừng đổ mồ hôi. Nhưng nếu bạn đạt 20, bạn sẽ biết bạn không ở đúng sân bóng cho quy tắc này.


Điều đó làm cho nó một xấp xỉ khá rõ ràng sau đó. Nó được đánh dấu trong "Nguyên tắc mà bạn không bao giờ nên bỏ qua và nên áp dụng cho mọi tình huống".
brian

1
@brian - có thể các nhà văn hướng dẫn đã vô tình bỏ qua từ "đại khái", hoặc có thể họ là những nhà độc tài điên rồ. Quan điểm của tôi là OP nên coi đây là số sân. Bất kỳ quy tắc nào trình biên dịch hoặc trình thông dịch không thực thi chỉ là một gợi ý.
Nathan Long

"Bất kỳ quy tắc nào trình biên dịch hoặc trình thông dịch không thực thi chỉ là một gợi ý" Không nhất thiết phải đúng. Tôi đã không xem xét các quy tắc chia sẻ lại hoặc fxcop tùy chỉnh của anh ấy và nếu họ thực sự thực thi quy tắc cụ thể này, nhưng có những công ty buộc bạn phải xác nhận chống lại tất cả các nguyên tắc về phong cách. Tôi đã gặp những người mà công ty buộc họ viết mã có thể vượt qua các nguyên tắc mã hóa nghiêm ngặt của Microsoft.
brian

Tôi đồng ý rằng nó chỉ là gần đúng và nó nên được lấy bằng một hạt muối, việc có một đoạn mã tiêu chuẩn đưa ra một số tùy ý chắc chắn sẽ gây nhầm lẫn. Hầu hết các tiêu chuẩn sẽ được đưa ra khỏi bối cảnh và "mọi người" sẽ tuân theo sự gần đúng tùy ý đó như một giáo điều.
Spoike

10

7 là một con số hoàn toàn tùy ý, hoàn toàn không có ý nghĩa.

Độ phức tạp theo chu kỳ là một vấn đề lớn hơn số lượng báo cáo. Tôi đã thấy mã có 100 câu lệnh trong một phương thức (mà tôi nghĩ là khủng khiếp), nhưng nó có độ phức tạp theo chu kỳ là 1 và nó thực sự chỉ làm được 1 điều. Chỉ có rất nhiều bước. Chúng tôi đã thảo luận tách nó thành các phương thức nhỏ hơn, nhưng các phương thức đó sẽ chỉ được gọi bằng phương thức này.

Trong khi đó là một trường hợp khá cực đoan, vấn đề là bạn cần giữ mã DRY và độ phức tạp chu kỳ thấp. Điều đó quan trọng hơn số lượng dòng trong một phương thức.

Lấy một tuyên bố chuyển đổi / trường hợp ví dụ. Nếu bạn có nhiều hơn 7 giá trị có thể, bạn có cần chia đánh giá thành nhiều phương thức không? Tất nhiên là không, điều đó sẽ thật ngớ ngẩn.

Việc giả mạo mã thành nhiều phương thức hơn chỉ để giữ số lượng câu lệnh dưới 7 chỉ làm cho mã của bạn tệ hơn.

Hướng dẫn nên là Mỗi phương thức nên làm 1 điều và giữ mã DRY của bạn.


1
+1: Giới hạn tùy ý chỉ hữu ích tùy ý. Một phương thức nên chứa một hoạt động kết hợp duy nhất ở một mức độ trừu tượng duy nhất. Việc phá vỡ một đơn vị nguyên tử như vậy làm cho mã phức tạp hơn, khiến việc hiểu mã trở nên khó khăn hơn.
Allon Guralnek

DRY được đánh giá quá cao. Thông thường, điều đó có nghĩa là liên kết chặt chẽ hai khía cạnh của một thứ không nên kết hợp chặt chẽ.
Brad Thomas

4

Vâng, nó phụ thuộc một chút. Tôi viết rất nhiều mã truy cập cơ sở dữ liệu. Mã tấm nồi hơi để xử lý ngoại lệ là nhiều hơn bảy câu lệnh trong rất nhiều trường hợp. Tôi muốn nói rằng hướng dẫn tốt nhất là đảm bảo chức năng của bạn có một mục đích


8
Bạn không thể trừu tượng mã soạn sẵn thành phương thức riêng của nó?
erjiang

Tôi nhận thấy sau khi đăng bài rằng đây là C # không phải Java nhưng tôi đang nghĩ về loại điều này. stackoverflow.com/questions/321418/iêu
Jaydee

@erjang: bạn có thể. Nó rất xấu trong Java, vì bạn phải bọc từng truy vấn trong một lớp ẩn danh, nhưng vẫn đáng để thực hiện. Không quá xấu xí trong C #, và chắc chắn đáng làm.
kevin cline

Cá nhân, tôi tìm thấy một vài dòng mã dòng ổn định để dễ đọc hơn. Nhưng có lẽ đó chỉ là tôi.
Jaydee

@Jaydee Câu hỏi được liên kết cho thấy thực tiễn phổ biến nhưng kỳ lạ: Bao bọc một ngoại lệ và ghi nhật ký. Ở cấp độ tiếp theo, bạn có thể làm tương tự ... bằng cách này, một ngoại lệ duy nhất xuất hiện nhiều lần trong nhật ký. Sẽ tốt hơn khi khai báo phương thức ném và bạn đã lưu 3 dòng. Viết một phương pháp helper đóng cả hai psrsvà lưu lẫn nhau. Hoặc viết một phương thức List<Row> readDb(String sql, Object... args)thực hiện toàn bộ công việc (chỉ hoạt động đối với các tập kết quả phù hợp trong bộ nhớ, nhưng tìm nạp quá nhiều dữ liệu thường ngụ ý rằng dù sao công việc cũng nên được thực hiện trong DB).
maaartinus

4

Tất cả mọi thứ là một sự đánh đổi. Vấn đề với cách tiếp cận được đề xuất - tái cấu trúc thành một số phương thức và các lớp sao cho mỗi phương thức ngắn - là mặc dù vì những lý do khác nhau, nó dẫn đến mã không thể đọc được khi được đưa đến mức cực đoan.

Hãy tưởng tượng một phương pháp foo()làm 7 việc. Bạn có thể lập luận rằng 7 điều là quá nhiều. Có thể trong nhiều trường hợp bạn đúng. Mặt khác, 7 điều này có thể liên quan chặt chẽ với nhau; logic có thể trôi chảy và đọc như văn xuôi; bạn có thể không gặp khó khăn để hiểu nó khi bạn thực sự cần. Điều có thể tồi tệ hơn nhiều là có 7 thứ đó được phân phối trên một cây nguồn lớn, do đó nếu bạn nhìn vào foo()bạn sẽ không biết nó làm gì mà không tìm kiếm ở 7 nơi khác nhau.

Nhiều người nhận được các quy tắc như thế này trong đầu, và kết quả là những gì tôi nghĩ về spaghetti OO. Mọi thứ đều gọn gàng, được đóng hộp theo phương pháp hoặc lớp nhỏ của riêng nó, với các giao dịch vi mô nhỏ nguyên tử xảy ra ở mỗi nơi. Nhưng không thể làm mới cơ sở mã như vậy và biết nó đang làm gì. Bạn trở nên lạc lõng.


4

Đó không phải là một hướng dẫn tồi. Tôi chưa bao giờ hối hận về việc chia nhỏ các phương thức và các lớp (tôi chưa bao giờ thấy mình có quá nhiều) miễn là chúng được nhóm lại và liên quan với nhau đủ tốt.

Mẹo nhỏ là KHÔNG chia nó theo chiều dọc (Chỉ cần ngắt một phương thức tại một điểm và bắt đầu một phương thức mới). Thủ thuật, giống như với kiểm thử đơn vị, là ghi nhớ quy tắc như vậy ngay từ đầu để bạn thực sự thiết kế tốt hơn, chuyển 3 hoặc 4 câu lệnh giữa phương thức sang phương thức khác vì có một cuộc gọi phương thức mô tả những gì bạn đang làm tốt hơn 3 hoặc 4 câu lệnh ở giữa mã của bạn.

Kiểu phân tách này, ngay cả khi nó tùy ý và chỉ được sử dụng một lần, có thể dẫn đến việc tái cấu trúc tốt hơn sau đó do sự rõ ràng mới của mã, điều này cũng đúng với các lớp nhỏ hơn.

Hãy nghĩ về nó giống như bạn sẽ thử nghiệm đơn vị. Nếu bạn cố gắng thêm kiểm thử đơn vị sau khi thực tế thì điều đó thật khó khăn và đôi khi dường như là không thể nhưng nếu bạn thiết kế nó ngay từ đầu thì nó thực sự làm cho tất cả mã của bạn tốt hơn.

Tóm lược? Nếu so sánh mùi thiết kế của "Sử dụng ít hơn 7 câu lệnh" với mùi mã của "Tôi đã sử dụng hơn 7 câu lệnh", tôi muốn loại bỏ mùi mã hơn.


4

Ồ Tôi không bao giờ mong đợi tìm thấy một cuộc thảo luận căng thẳng như vậy trên một hướng dẫn đơn giản mà đại khái nói rằng các phương pháp của bạn nên rất nhỏ. Bởi vì họ luôn là những nhà phát triển muốn hướng dẫn của họ rõ ràng, tôi chọn 7 vì điều đó nghe có vẻ như là một ngưỡng tốt.

Một số bạn đã trích dẫn từ chối trách nhiệm ở phần đầu của tài liệu. Nhưng để rõ ràng, tài liệu này đại diện cho một tập hợp các hướng dẫn cố gắng giúp bạn viết mã tốt hơn và thiết kế các hệ thống tốt hơn. Tôi chưa bao giờ tuyên bố rằng bất cứ điều gì nên là một quy tắc, mặc dù hướng dẫn được đánh dấu là cấp 1. Những cấp độ đó chỉ đơn giản là ý kiến ​​chung của nhiều người đã sử dụng tài liệu này trong một thời gian.

Tôi cũng chưa bao giờ tự nhận là một chuyên gia. Nhưng tôi đã làm nghề này được 15 năm rồi, với khoảng 4 năm kinh nghiệm về C ++ và 11 năm kinh nghiệm về C #. Ban đầu nó dựa trên Sức mạnh công nghiệp C ++, nhưng tôi đã tinh chỉnh nó kể từ đó với đầu vào từ cộng đồng.

Bất kể, điểm tôi đang cố gắng nêu lên là bạn nên tiếp tục suy nghĩ cho chính mình. Nếu bạn nghĩ rằng hướng dẫn 7 câu không hữu ích, thì chỉ cần làm cho nó dài hơn. Heck, tôi thậm chí thỉnh thoảng vi phạm hướng dẫn đó. Tôi chỉ vi phạm nó một cách đồng ý và chấp nhận hậu quả.


3
Tốt của bạn để hòa nhập, và tôi nghĩ rằng bạn đưa ra một lập luận hợp lý. Điều đó nói rằng, tôi không đồng ý với cơ sở lý luận của bạn, họ luôn luôn là những nhà phát triển muốn hướng dẫn của họ rõ ràng: bạn không thể luôn phục vụ cho những kẻ ngốc và bạn không nên thử. Làm cho các hướng dẫn rõ ràng là tốt miễn là điều này không làm cho chúng không chính xác: bây giờ nó không còn là một hướng dẫn nữa, đó là một quy tắc tùy ý. Giới thiệu các con số tùy ý, như bạn đã chứng kiến, là một cách chết chắc chắn để bị bắn hạ, và hợp lý.
Konrad Rudolph

3

Thứ nhất: đó là một hướng dẫn, không phải là một quy tắc. Nó được gọi là hướng dẫn, vì vậy hãy coi nó như vậy. Điều này ngụ ý rằng sự phán xét của riêng bạn cũng được yêu cầu (như mọi khi)

Ngoài ra, tôi có thể nghĩ ra rất nhiều ví dụ về mã tốt không tuân thủ ràng buộc này. Mặc dù nó chỉ là một hướng dẫn, nó là một người nghèo.


2

Tôi đồng ý với tuyên bố trên tôi. Đây chỉ là kim chỉ nam và trong một thế giới hoàn hảo, mọi thứ sẽ là đồ vật, được tái sử dụng trong mọi chương trình và thế giới sẽ là một nơi tuyệt đẹp. Điều này không phải lúc nào cũng đúng và đôi khi điều đó sẽ dẫn đến rất nhiều tài nguyên hoặc lãng phí. Bạn cũng cần phải ghi nhớ điều đó.


6
"Tôi đồng ý với tuyên bố trên tôi" Tránh loại câu này trong các trang web stackexchange. Hãy nhớ rằng thứ tự các câu trả lời được đăng không nhất thiết phải là thứ tự chúng được hiển thị.
luiscubal

Tôi biết, tôi đã không nghĩ về cho đến khi quá muộn. Nhưng tôi vẫn sẽ +1 bạn vì đã chỉ ra rắm não của tôi.
Falcon165o

2

Khá ngớ ngẩn khi bạn thêm xử lý ngoại lệ vào hỗn hợp.

Sau khi "thử, bắt, cuối cùng", bạn còn lại bốn câu lệnh cho mỗi phương thức!

Ngoài ra, hãy xem xét một phương thức "validateForm" cho biểu mẫu 20 trường, ngay cả khi bạn xử lý tất cả các xác nhận riêng lẻ trong các phương thức riêng biệt, bạn vẫn có 20 phương thức xác thực trường để gọi. Theo các hướng dẫn này, bạn sẽ kết thúc với một số phân chia vô nghĩa như "validateTopOfScreen", "validateMiddleOfScreen" và "validateBottomOfScreen".


Tôi nghĩ rằng khá an toàn để nói rằng try/ catch/ finallykhông phải là tuyên bố trong C #. Xem Ecma-334 § 12.3.3.15 và các phần xung quanh. (viết tắt) " một câu lệnh try-catch-cuối cùng có dạng : cố gắng cố gắng khối catch (...) bắt-block-n cuối cùng cuối cùng-block "
một CVN

Vâng, như tôi đã nói trước đây, đó là một quyết định mà bạn phải đưa ra nhiều lần. Tuy nhiên, ví dụ cụ thể của bạn có thể là một ví dụ về việc không thực hiện thiết kế hướng đối tượng một cách chính xác. Bạn có thể muốn chia màn hình của mình thành nhiều điều khiển để tự xác thực.
Dennis Doomen

@Dennis - đúng, đã làm các biểu mẫu HTML quá lâu!
James Anderson

@James Và đó là những gì hướng dẫn cụ thể này được dành cho. Cố gắng làm cho bạn nghĩ về giải pháp thay thế, có khả năng tốt hơn.
Dennis Doomen

2

Câu hỏi là kết hợp "quy tắc" với "hướng dẫn". Các quy tắc có nghĩa là phải tuân theo - hướng dẫn là lời khuyên có nghĩa là khiến bạn phải xem xét những gì bạn đang làm và nếu nó thực sự có thể được thực hiện theo cách tốt hơn.

Tôi nói, trung bình, hầu hết các chương trình có thể được cải thiện bằng cách làm theo các hướng dẫn nhưng sẽ luôn có trường hợp tuân theo các hướng dẫn một cách giáo điều sẽ gây ra nhiều vấn đề hơn so với dự định giải quyết. Đó là lý do tại sao chúng không được trình bày dưới dạng quy tắc, mà là hướng dẫn.

Một người trả lời trước đã chỉ ra rằng các tác giả của các hướng dẫn không bao giờ có ý định áp dụng chúng một cách giáo điều và bao gồm các tuyên bố về hiệu ứng đó trong tài liệu của họ.


0

Tôi đồng ý với soe của các ý kiến ​​trên. 7 đối với tôi là độc lập và có thể hữu ích trong một số ngôn ngữ có ruby, nhưng đối với các ngôn ngữ như C #, Java, C ++, tôi nghi ngờ quy ước "7 dòng" này. Để tôi cho bạn một ví dụ. Ứng dụng hiện tại của tôi có 22 trường văn bản và tôi xác thực phía máy chủ. Phương thức này được gọi là validateInput () và tùy chọn của tôi là xác thực tất cả các trường trong một phương thức trừ khi tôi xác thực một cái gì đó phức tạp như checkEmailFormat (). Vì vậy, về cơ bản mã phương thức validateInput của tôi là 108 dòng với các lệnh gọi thỉnh thoảng để xác thực phức tạp.

Bây giờ hãy tưởng tượng nếu tôi gọi 25 phương thức để xác nhận từng trường. Nếu một nhà phát triển mới xuất hiện, anh ta sẽ phải vào và ra khỏi phương thức chính để chuyển qua 25 phương thức mà lần lượt có thể gọi một vài phương thức khác. Anh ấy chắc chắn sẽ bị lạc trong các dự án lớn.

Những gì tôi thực sự làm để làm cho mã của tôi rõ ràng là cung cấp các nhận xét rõ ràng về cơ bản nói lên những gì 4 dòng này đang làm -

validateInput (người dùng UserObj) {

// Xác thực tên đầu tiên ....... ......

// xác thực họ ...... ......

// xác thực email ..... // quá phức tạp để kiểm tra định dạng email expresion thường xuyên checkEmailFormat (); .... .....

và v.v.


1
Xem thêm câu trả lời của tôi cho câu hỏi của James Andersons. Trong trường hợp cụ thể của bạn, tôi tự hỏi nếu phương pháp xác nhận đó không vi phạm một số nguyên tắc và hướng dẫn cùng một lúc.
Dennis Doomen

0

Quy tắc xấu. Với mã để xử lý ngoại lệ, thiết lập các trường cơ sở dữ liệu, xác nhận hợp lệ, làm thế nào hầu hết các phương thức có thể nằm dưới bảy câu lệnh? Chúng ta có bao giờ nên làm chức năng lambda nội tuyến?

Các dòng mã là một số lượng phức tạp tùy ý. Với các phương thức mở rộng, tôi có thể tạo mã như

                Parallel.ForEach(regions, region => {   Console.Write(region.Resorts.Where(x => x.name == "Four Seasons").OrderBy(x => x.RegionId).ThenBy(x => x.ResortId).ThenBy(x => x.name).ToList());   });

Lại một ví dụ tuyệt vời về việc làm quá nhiều trong một phương pháp duy nhất. Trong hầu hết mọi người phản biện đều vi phạm Nguyên tắc Trách nhiệm duy nhất (trong bối cảnh của một phương pháp).
Dennis Doomen

-1

Tất cả các lập trình viên cơ sở nên bị buộc phải tuân thủ nguyên tắc này. Điều đó sẽ buộc họ phải suy nghĩ về cấu trúc của những gì họ đang bận rộn, thay vì chỉ thêm ngày càng nhiều mã dòng.

Tôi hiện đang xem xét một phương pháp gồm 550 dòng mã với rất nhiều câu lệnh if khác và tiếp tục và trả về được dệt vào nó. Đó là tào lao. Có phải lập trình viên chỉ bị buộc phải suy nghĩ về những gì anh ta đang làm ...

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.