Cái nào dễ bảo trì hơn - gán boolean qua biểu thức if / other hoặc boolean?


11

Mà sẽ được coi là duy trì nhiều hơn?

if (a == b) c = true; else c = false;

hoặc là

 c = (a == b);

Tôi đã thử tìm kiếm trong Code Complete, nhưng không thể tìm thấy câu trả lời.

Tôi nghĩ rằng đầu tiên là dễ đọc hơn (bạn có thể đọc nó thành tiếng), mà tôi cũng nghĩ làm cho nó dễ bảo trì hơn. Cái thứ hai chắc chắn có ý nghĩa hơn và giảm mã, nhưng tôi không chắc nó có thể duy trì được cho các nhà phát triển C # (ví dụ, tôi hy vọng sẽ thấy thành ngữ này nhiều hơn trong Python).


3
Hai cái không tương đương. Bạn cần một else c = falsecho đầu tiên hoặc thực hiện một nhiệm vụ ||=trong thứ hai.

17
Tôi nghĩ rằng thực tế là bạn đã phải thực hiện hai lần chỉnh sửa cho mẫu đầu tiên trả lời câu hỏi của bạn!
James

7
Tôi đồng ý với @James. Hình thức thứ hai, mặc dù không dài dòng, rất đơn giản để hiểu và không để lại sự mơ hồ về ý nghĩa của nó. Không có thủ thuật hay phím tắt nào được thực hiện, nó chỉ ngắn gọn vì khái niệm này đơn giản. Việc bạn đã mã hóa lỗi đầu tiên và đã phải chỉnh sửa nó để sửa nó, và nó vẫn chưa hoàn hảo (sử dụng niềng răng không nhất quán), là bằng chứng tích cực rằng nó không đơn giản như bạn nghĩ.
Eric King

5
Wow, các nhà phát triển C # có thực sự xem xét hình thức đầu tiên có thể chấp nhận không? Điều này ... làm giảm nghiêm trọng niềm tin của tôi vào họ. Theo kinh nghiệm của tôi, việc sử dụng các hình thức đầu tiên rất nhiều gợi ý về sự hiểu lầm hoàn toàn về các biểu thức boolean.
Andres F.

2
Để giữ cho mọi thứ thú vị, đây là một lựa chọn khác:c = a==b ? true : false;
Thất vọngWithFormsDesigner

Câu trả lời:


14

Tùy chọn thứ hai là tốt hơn.

Có lý do chắc chắn để cảnh giác với các phím tắt lập trình thông minh làm tổn thương khả năng bảo trì bằng cách che khuất ý định của mã. Vì vậy, tôi không trách bạn đã đặt câu hỏi.

Tuy nhiên, tôi không coi c = (a == b);là một ví dụ về một mánh khóe thông minh. Đó là một đại diện đơn giản của một khái niệm đơn giản. Càng thẳng càng tốt.

Một thích hợp, "duy trì" định dạng của ví dụ đầu tiên của bạn (không có dấu ngoặc mất tích và một dòng cấu trúc, mà tôi làm xét một phím tắt thông minh) sẽ mang mã này:

if (a == b)
{
    c = true; 
}
else 
{
    c = false;
}

Theo kinh nghiệm của tôi, viết logic boolean đơn giản theo cách dài dòng, dễ bị lỗi là một dấu hiệu của mã "iffy". Nó sẽ làm cho tôi tự hỏi làm thế nào logic phức tạp hơn đang được xử lý trong cơ sở mã này.


15

Đầu tiên, nhận ra rằng hai hình thức của bạn không tương đương.

if (a == b) c = true;

csẽ được đặt thành true nếu abằng b, và nếu không, giá trị của nó sẽ vẫn là bất cứ giá trị nào.

c = (a == b);

csẽ được đặt thành true nếu abằng bvà nếu không, nó sẽ được đặt thành false.

Nếu bạn muốn tương đương với hình thức thứ hai, theo phong cách của hình thức đầu tiên, bạn cần viết nó như thế này:

if (a == b) {
  c = true;
} else c = false;

Bây giờ, rõ ràng cái nào trong hai cái dễ đọc hơn, dễ bảo trì hơn và ít có khả năng giới thiệu lỗi hơn nếu có gì đó bị thay đổi. Gắn bó với hình thức thứ hai.


Hoàn toàn đúng - Tôi đã cập nhật câu hỏi của mình.
Bret Walker

Tôi xem xét hình thức thứ hai quá dài và phức tạp - nếu bạn muốn hiệu ứng đó, hãy sử dụng một phép gán boolean.
Phục hồi Monica - M. Schröder

11

Tôi không đồng ý rằng hình thức đầu tiên của bạn dễ đọc hơn - chắc chắn C # không có hai câu lệnh trên một dòng duy nhất và không nên có một ifcâu lệnh mà không sử dụng dấu ngoặc nhọn.

Thứ hai, tôi không thấy hình thức thứ hai ít được bảo trì hơn - không có gì để duy trì. Đó là một tuyên bố đơn giản về mối quan hệ giữa abvà nó không thể được bày tỏ bất kỳ đơn giản hơn.

Một lý do khác để thích hình thức thứ hai là bạn có thể khai báo cvà gán nó trong một câu lệnh

bool c = (a == b);

Sửa đổi các biến có thể dễ dàng dẫn đến lỗi, vì vậy tôi sẽ tránh nó. Sử dụng một ifcâu lệnh yêu cầu biến phải được khai báo trước điều kiện và sau đó sửa đổi.


Tôi đọc hai câu lệnh trên một dòng dưới dạng mã giả
Jimmy Hoffa

1
+1 cho " Another reason to prefer the second form is that you can declare c and assign it in a single statement"
Andres F.

0

"Dễ bảo trì hơn" có thể rất chủ quan.

Tôi thường thích khả năng đọc và ý định giảm mã. Tôi nghĩ bạn lưu 8 ký tự đã gõ bằng cách sử dụng biểu mẫu rút gọn.

Theo tôi, ngôn ngữ và văn hóa xung quanh ngôn ngữ là một đặc điểm của 'khả năng đọc'.

Đôi khi hiệu năng có thể là nguyên nhân làm giảm mã để tối ưu hóa mã byte kết quả, nhưng điều đó nên được thực hiện cẩn thận sau một số hồ sơ.


Chủ quan: Duh. Giảm mã: Cũng có thể (nếu không quá liều) cải thiện sự rõ ràng và ý định giao tiếp tốt hơn. Hiệu suất: Không có gì đáng lo ngại cả (tối ưu hóa đôi khi rất quan trọng, nhưng đây không phải là điều gì đó nằm trong tối ưu hóa, bởi vì thực tế nó không bao giờ quan trọng - có lẽ không phải ngay cả khi bạn đang viết kernel hoặc trình điều khiển).

4
Mẫu đầu tiên có ít nhất 1 lỗi cần được sửa, ẩn trong tính dài dòng của nó. Hình thức thứ hai là đơn giản và đến mức, và không có lỗi. I nghỉ ngơi trường hợp của tôi. Trong mọi trường hợp, mục đích chính là không gõ ít ký tự! Và câu hỏi này không phải là về hiệu suất, điều này không liên quan trong trường hợp này.
Andres F.

@delnan chính xác quan điểm của tôi, Duh. giảm mã của ai đó là sự rõ ràng của người khác. Tôi không trích dẫn tối ưu hóa là mối quan tâm chính ... Tôi đã sử dụng nó làm ví dụ. Lý do của bạn để thêm các thủ thuật thông minh hoặc đi ra ngoài định mức nên được cân bằng bởi bất cứ điều gì bạn / văn hóa / doanh nghiệp sẽ coi là có thể đọc được.
Johnnie

1
Viết một biểu thức boolean sạch sẽ không phải là một mẹo thông minh!
Andres F.

Tôi đoán tôi sẽ đặt nhiều công đức hơn vào nhận xét của bạn nếu bạn thực sự giải quyết được tinh thần của câu hỏi và không phải là một sự tương tự inane được sử dụng để ủng hộ một khái niệm cơ bản.
Johnnie

0

Thư hai. Nó có ít sự lặp lại (DRY) và dễ hiểu hơn những gì đang diễn ra, điều đó đúng cvới giá trị của việc có hay không abbằng nhau.

IMHO, thậm chí tốt hơn sẽ là

c = a == b

Cũng như tôi sẽ viết

  • 1 + 2 + 3 thay vì ((1 + 2) + 3)
  • 5 + 3 * 7 thay vì (5 + (3 * 7))

Rõ ràng và mã không cần thiết tầm thường không phải là một đức tính. Nó bừa bộn.


-4

Những người bỏ phiếu, xin hãy giải thích những gì sai với câu trả lời sửa đổi của tôi.

Có, c = (a == b);có thể khó đọc (tệ hơn nữa, StyleCop phàn nàn về dấu ngoặc đơn không cần thiết), nhưng tôi vẫn thích sự đơn giản của a == b. Do đó, đây là những gì tôi thích sử dụng khi cả hai abgiống nhau:

private static bool NoPeriod
{
    get
    {
        return this.MyWaveLength == this.HerWaveLength;
    }
}

Và sau đó bạn có thể làm: this.c = this.NoPeriodthay vì:

this.c = this.MyWavelength == this.HerWaveLength;

1
vậy ý ​​bạn là gì return this.MyWaveLength = this.HerWaveLength;hay return this.MyWaveLength == this.HerWaveLength;thay vào đó?
Jesse C. Choper

5
Gì!? c = (a == b);không dễ bị lỗi. Hình thức đầu tiên trong câu hỏi ban đầu là dễ bị lỗi hơn , như thể hiện bởi chính OP phải chỉnh sửa câu hỏi của mình để sửa lỗi!
Andres F.

Tôi đoán giải pháp được đề xuất của bạn có lỗi = vs. ==
Ondra

@Ondra Morský, cảm ơn ... trình biên dịch sẽ bắt được điều này cho tôi.
Công việc

6
Tôi không quen thuộc với StyleCop, nhưng nếu nó cho bạn biết các dấu ngoặc đơn không cần thiết là xấu, bạn nên tắt nó đi. Các dấu ngoặc đơn không cần thiết không cần thiết cho trình biên dịch, nhưng chúng có thể rất, rất đẹp cho mắt người. Nếu bạn đã viết c = a == b; trình biên dịch có thể tìm ra nó tốt, nhưng nó khó hơn cho con người.
Michael Shaw
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.