Tôi có nên chấp nhận các bộ sưu tập trống trong các phương thức lặp đi lặp lại chúng không?


40

Tôi có một phương thức trong đó tất cả logic được thực hiện bên trong một vòng lặp foreach lặp lại qua tham số của phương thức:

public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes)
{
    foreach(var node in nodes)
    {
        // yadda yadda yadda
        yield return transformedNode;
    }
}

Trong trường hợp này, việc gửi một bộ sưu tập trống dẫn đến một bộ sưu tập trống, nhưng tôi tự hỏi liệu điều đó có không khôn ngoan không.

Logic của tôi ở đây là nếu ai đó đang gọi phương thức này, thì họ có ý định truyền dữ liệu vào và sẽ chỉ chuyển một bộ sưu tập trống cho phương thức của tôi trong các trường hợp sai lầm.

Tôi có nên nắm bắt hành vi này và ném ngoại lệ cho nó hay không, hay là cách tốt nhất để trả lại bộ sưu tập trống?


43
Bạn có chắc chắn giả định của bạn "nếu ai đó đang gọi phương thức này, thì họ có ý định truyền dữ liệu vào" là chính xác không? Có lẽ họ chỉ đang vượt qua những gì họ có trong tay để làm việc với kết quả.
SpaceTrucker

7
BTW: phương thức "biến đổi" của bạn thường được gọi là "map", mặc dù trong .NET (và SQL, nơi .NET có tên từ đó), nó thường được gọi là "select". "Transform" là cái mà C ++ gọi nó, nhưng đó không phải là một tên phổ biến mà người ta có thể nhận ra.
Jörg W Mittag

25
Tôi sẽ ném nếu bộ sưu tập là nullnhưng không nếu nó trống.
CodeInChaos

21
@NickUdell - Tôi luôn chuyển các bộ sưu tập trống trong mã của mình. Mã dễ dàng hoạt động giống như viết logic phân nhánh đặc biệt cho các trường hợp tôi không thể thêm bất cứ thứ gì vào bộ sưu tập của mình trước khi tiếp tục với nó.
Người chơi

7
Nếu bạn kiểm tra và ném lỗi nếu bộ sưu tập trống, thì bạn đang buộc người gọi của bạn cũng kiểm tra và không chuyển một bộ sưu tập trống cho phương thức của bạn. Việc xác thực phải được thực hiện trên (và chỉ trên) ranh giới hệ thống, nếu các bộ sưu tập trống làm phiền bạn, bạn đã kiểm tra chúng từ lâu trước khi nó đạt được bất kỳ phương thức tiện ích nào. Bây giờ bạn có hai kiểm tra dự phòng.
Lie Ryan

Câu trả lời:


175

Phương pháp tiện ích không nên ném vào bộ sưu tập trống. Các khách hàng API của bạn sẽ ghét bạn vì điều đó.

Một bộ sưu tập có thể trống rỗng; một "bộ sưu tập-mà-không-phải-không-trống" về mặt khái niệm là một điều khó khăn hơn nhiều để làm việc với.

Chuyển đổi một bộ sưu tập trống có một kết quả rõ ràng: bộ sưu tập trống. (Bạn thậm chí có thể lưu một số rác bằng cách trả lại tham số.)

Có nhiều trường hợp trong đó một mô-đun duy trì danh sách các công cụ có thể hoặc không thể chứa đầy thứ gì đó. Phải kiểm tra sự trống rỗng trước mỗi cuộc gọi đến transformlà khó chịu và có khả năng biến một thuật toán đơn giản, thanh lịch thành một mớ hỗn độn xấu xí.

Các phương pháp tiện ích phải luôn luôn cố gắng để tự do trong đầu vào của họ và bảo thủ trong đầu ra của họ.

Vì tất cả những lý do này, vì lợi ích của Chúa, hãy xử lý bộ sưu tập trống một cách chính xác. Không có gì bực tức hơn một mô-đun trợ giúp nghĩ rằng nó biết những gì bạn muốn tốt hơn bạn làm.


14
+1 - (nhiều hơn nếu tôi có thể). Tôi thậm chí có thể đi xa đến mức kết hợp lại nullvới bộ sưu tập trống. Chức năng với những hạn chế ngầm là một nỗi đau.
Telastyn

6
"Không, bạn không nên" ... không nên chấp nhận chúng hay không nên ném ngoại lệ?
Ben Aaronson

16
@Andy - mặc dù đó không phải là phương thức tiện ích . Chúng là phương thức kinh doanh hoặc một số hành vi cụ thể tương tự.
Telastyn

38
Tôi không nghĩ tái chế bộ sưu tập trống để trả lại là một ý tưởng tốt. Bạn chỉ tiết kiệm được một chút bộ nhớ; và nó có thể dẫn đến hành vi bất ngờ trong người gọi. Ví dụ hơi khó hiểu: Populate1(input); output1 = TransformNodes(input); Populate2(input); output2 = TransformNodes(input); Nếu Population1 để trống bộ sưu tập và bạn trả lại cho cuộc gọi TransformNodes đầu tiên, output1 và đầu vào sẽ là cùng một bộ sưu tập và khi Populaten2 được gọi nếu nó đặt các nút trong bộ sưu tập, bạn sẽ kết thúc với lần thứ hai bộ đầu vào trong output2.
Dan Neely

6
@Andy Mặc dù vậy, nếu đối số không bao giờ trống - nếu đó là lỗi không có dữ liệu để xử lý - thì tôi cảm thấy trách nhiệm của người gọi là phải kiểm tra điều này, khi đối chiếu đối số đó. Nó không chỉ giữ cho phương thức này thanh lịch hơn mà còn có nghĩa là người ta có thể tạo ra một thông báo lỗi tốt hơn (ngữ cảnh tốt hơn) và nâng nó lên một cách nhanh chóng. Không có ý nghĩa gì đối với một lớp hạ lưu để xác minh sự bất biến của người gọi ...
Andrzej Doyle

26

Tôi thấy hai câu hỏi quan trọng quyết định câu trả lời cho điều này:

  1. Hàm của bạn có thể trả về bất cứ điều gì có ý nghĩa và logic khi thông qua một bộ sưu tập trống (bao gồm null ) không?
  2. Phong cách lập trình chung trong ứng dụng / thư viện / nhóm này là gì? (Cụ thể, bạn thế nào?)

1. Trả lại có ý nghĩa

Về cơ bản, nếu bạn có thể trả lại một cái gì đó có ý nghĩa, thì đừng ném ngoại lệ. Hãy để người gọi giải quyết kết quả. Vì vậy, nếu chức năng của bạn ...

  • Đếm số lượng phần tử trong bộ sưu tập, trả về 0. Điều đó thật dễ dàng.
  • Tìm kiếm các yếu tố phù hợp với tiêu chí cụ thể, trả về một bộ sưu tập trống. Xin đừng ném bất cứ thứ gì. Người gọi có thể có một bộ sưu tập lớn các bộ sưu tập, một số trong đó trống, một số thì không. Người gọi muốn bất kỳ yếu tố phù hợp trong bất kỳ bộ sưu tập. Ngoại lệ chỉ làm cho cuộc gọi của người gọi cuộc sống khó khăn hơn.
  • Đang tìm kiếm các tiêu chí lớn nhất / nhỏ nhất / phù hợp nhất với tiêu chí trong danh sách. Rất tiếc. Tùy thuộc vào câu hỏi về kiểu, bạn có thể ném ngoại lệ vào đây hoặc bạn có thể trả về null . Tôi ghét null (rất nhiều người FP) nhưng nó có ý nghĩa hơn ở đây và nó cho phép bạn bảo lưu ngoại lệ cho các lỗi không mong muốn trong mã của riêng bạn. Nếu người gọi không kiểm tra null, thì một ngoại lệ khá rõ ràng sẽ xảy ra. Nhưng bạn để lại cho họ.
  • Yêu cầu cho mục thứ n trong bộ sưu tập hoặc n mục đầu tiên / cuối cùng. Đây là trường hợp tốt nhất cho một ngoại lệ và là trường hợp ít có khả năng gây nhầm lẫn và khó khăn nhất cho người gọi. Một trường hợp vẫn có thể được thực hiện cho nếu bạn và nhóm của bạn được sử dụng để kiểm tra cho rằng, đối với tất cả những lý do được đưa ra trong thời điểm trước, nhưng đây là trường hợp có giá trị nhất nào cho ném một DudeYou Biết YouShouldCheckTheSizeFirst ngoại lệ. Nếu kiểu của bạn có nhiều chức năng hơn, thì hãy bỏ qua hoặc đọc câu trả lời Kiểu của tôi .

Nói chung, thiên vị FP của tôi nói với tôi ¨ từ bỏ một cái gì đó có ý nghĩa¨ và null có thể có ý nghĩa hợp lệ trong trường hợp này.

2. Phong cách

Mã chung của bạn (hoặc mã của dự án hay mã nhóm của nhóm) có thích kiểu chức năng không? Nếu không, các trường hợp ngoại lệ sẽ được dự kiến ​​và xử lý. Nếu có, sau đó xem xét trả lại Loại tùy chọn . Với một loại tùy chọn, bạn có thể trả về một câu trả lời có ý nghĩa hoặc Không / Không có gì . Trong ví dụ thứ ba của tôi từ trên xuống, Không có thể là một câu trả lời tốt trong phong cách FP. Thực tế là hàm trả về một loại Tùy chọn báo hiệu rõ ràng cho người gọi hơn là một câu trả lời có ý nghĩa có thể không thể thực hiện được và người gọi nên được chuẩn bị để đối phó với điều đó. Tôi cảm thấy nó mang lại cho người gọi nhiều lựa chọn hơn (nếu bạn sẽ tha thứ cho trò chơi chữ).

F # là nơi tất cả những đứa trẻ .Net tuyệt vời làm điều này nhưng C # không hỗ trợ phong cách này.

tl; dr

Giữ ngoại lệ cho các lỗi không mong muốn trong đường dẫn mã của riêng bạn, không hoàn toàn có thể thấy trước (và hợp pháp) từ người khác.


"Phù hợp nhất" vv.: Bạn có thể có một phương pháp tìm đối tượng phù hợp nhất trong bộ sưu tập phù hợp với một số tiêu chí. Phương pháp đó sẽ có cùng một vấn đề đối với các bộ sưu tập không trống, bởi vì không có gì có thể phù hợp với tiêu chí này, vì vậy không cần phải lo lắng về các lựa chọn trống.
gnasher729

1
Không, đó là lý do tại sao tôi nói ¨best fit¨ chứ không phải ¨matches¨; cụm từ ngụ ý gần đúng nhất, không phải là một kết hợp chính xác. Các tùy chọn lớn nhất / nhỏ nhất nên là một đầu mối. Nếu chỉ có ¨best fit¨ được yêu cầu, thì bất kỳ bộ sưu tập nào có từ 1 thành viên trở lên sẽ có thể trả lại thành viên. Nếu chỉ có một thành viên, đó là phù hợp nhất.
itbruce

1
Trả về "null" trong hầu hết các trường hợp là tồi tệ hơn sau đó ném một ngoại lệ. Tuy nhiên, trả lại một bộ sưu tập trống là có ý nghĩa.
Ian

1
Không, nếu bạn phải trả lại một mục duy nhất (tối thiểu / tối đa / đầu / đuôi). Như đối với null, như tôi đã nói, tôi ghét nó (và thích các ngôn ngữ không có nó), nhưng nếu một ngôn ngữ có nó, bạn phải có khả năng xử lý và mã hóa nó. Tùy thuộc vào các quy ước mã hóa cục bộ, nó có thể phù hợp.
itbruce

Không có ví dụ nào của bạn có bất cứ điều gì để làm với một đầu vào trống. Chúng chỉ là những trường hợp đặc biệt của tình huống mà câu trả lời có thể là "không có gì." Đến lượt mình sẽ trả lời câu hỏi của OP về cách "xử lý" bộ sưu tập trống.
djechlin

18

Như mọi khi, nó phụ thuộc.

vấn đề gì khi bộ sưu tập trống không?
Hầu hết các mã xử lý bộ sưu tập có thể sẽ nói "không"; một bộ sưu tập có thể có bất kỳ số lượng các mục trong đó, bao gồm không.

Bây giờ, nếu bạn có một số loại bộ sưu tập không có mục nào trong đó, thì đó là một yêu cầu mới và bạn phải quyết định phải làm gì với nó.

Mượn một số logic kiểm tra từ thế giới Cơ sở dữ liệu: kiểm tra các mục không , một mục và hai mục. Điều đó phục vụ cho các trường hợp quan trọng nhất (loại bỏ bất kỳ điều kiện tham gia bên trong hoặc cartesian hình thành xấu).


Và nếu không có mục nào trong bộ sưu tập, thì lý tưởng nhất là đối số sẽ không phải là một lớp java.util.Collectiontùy chỉnh com.foo.util.NonEmptyCollection, có thể duy trì sự bất biến này và ngăn bạn vào trạng thái không hợp lệ để bắt đầu.
Andrzej Doyle

3
Câu hỏi này được gắn thẻ [c #]
Nick Udell

@NickUdell C # không hỗ trợ lập trình hướng đối tượng hay khái niệm về không gian tên lồng nhau? GẠCH
John Dvorak

2
Nó làm. Nhận xét của tôi là một sự làm rõ vì Andrzej phải bị nhầm lẫn (tại sao họ lại đi đến nỗ lực chỉ định tên được đặt cho một ngôn ngữ mà câu hỏi này không tham chiếu?).
Nick Udell

-1 để nhấn mạnh "nó phụ thuộc" nhiều hơn "gần như chắc chắn là có". Không có trò đùa - truyền đạt những điều sai trái làm thiệt hại ở đây.
djechlin

11

Là một vấn đề của thiết kế tốt, chấp nhận càng nhiều biến thể trong đầu vào của bạn càng thiết thực hoặc có thể. Chỉ nên ném ngoại lệ khi (kết quả đầu vào không được chấp nhận HOẶC xảy ra lỗi không mong muốn trong khi xử lý) VÀ kết quả là chương trình không thể tiếp tục theo cách có thể dự đoán được .

Trong trường hợp này, cần phải có một bộ sưu tập trống sẽ được trình bày và mã của bạn cần xử lý nó (điều này đã làm rồi). Sẽ là vi phạm tất cả những gì tốt nếu mã của bạn ném ngoại lệ ở đây. Điều này sẽ giống như nhân 0 với 0 trong toán học. Nó là dư thừa, nhưng hoàn toàn cần thiết để nó hoạt động theo cách nó làm.

Bây giờ, đối với bộ sưu tập null. Trong trường hợp này, một bộ sưu tập null là một lỗi lập trình: lập trình viên quên gán một biến. Đây là trường hợp có thể ném ngoại lệ, vì bạn không thể xử lý nó thành đầu ra một cách có ý nghĩa và cố gắng làm như vậy sẽ đưa ra hành vi không mong muốn. Điều này sẽ giống như chia cho số 0 trong toán học - nó hoàn toàn vô nghĩa.


Tuyên bố táo bạo của bạn là lời khuyên cực kỳ xấu trong tổng quát. Tôi nghĩ nó đúng ở đây nhưng bạn cần giải thích điều gì đặc biệt về tình huống này. (Nói chung đó là lời khuyên tồi vì nó thúc đẩy những thất bại thầm lặng.)
djechlin

@AAA - rõ ràng chúng tôi không viết một cuốn sách về cách thiết kế phần mềm ở đây, nhưng tôi không nghĩ đó là lời khuyên tồi nếu bạn thực sự hiểu những gì tôi đang nói. Quan điểm của tôi là đầu vào xấu tạo ra đầu ra mơ hồ hoặc tùy ý, bạn cần phải đưa ra một ngoại lệ. Trong trường hợp đầu ra hoàn toàn có thể dự đoán được (như trường hợp ở đây), thì việc ném một ngoại lệ sẽ là tùy ý. Điều quan trọng là không bao giờ đưa ra quyết định tùy tiện trong chương trình của bạn, vì đó là nơi mà hành vi không thể đoán trước xuất phát.
Người chơi

Nhưng đó là câu đầu tiên của bạn và là câu duy nhất được làm nổi bật ... không ai hiểu bạn đang nói gì. (Tôi không cố tỏ ra quá hung hăng ở đây, chỉ một trong những điều chúng tôi làm ở đây là học viết và giao tiếp và tôi cho rằng việc mất độ chính xác ở một điểm chính là có hại.)
djechlin

10

Giải pháp đúng là khó nhìn hơn nhiều khi bạn chỉ nhìn vào chức năng của mình một cách cô lập. Hãy xem xét chức năng của bạn như là một phần của một vấn đề lớn hơn . Một giải pháp khả thi cho ví dụ đó trông như thế này (trong Scala):

input.split("\\D")
.filterNot (_.isEmpty)
.map (_.toInt)
.filter (x => x >= 1000 && x <= 9999)

Đầu tiên, bạn tách chuỗi lên bằng các chữ số không, lọc ra các chuỗi trống, chuyển đổi chuỗi thành số nguyên, sau đó lọc để chỉ giữ các số có bốn chữ số. Chức năng của bạn có thể là map (_.toInt)trong các đường ống.

Mã này khá đơn giản vì mỗi giai đoạn trong đường ống chỉ xử lý một chuỗi rỗng hoặc một bộ sưu tập trống. Nếu bạn đặt một chuỗi trống vào lúc bắt đầu, bạn sẽ nhận được một danh sách trống ở cuối. Bạn không phải dừng lại và kiểm tra nullhoặc ngoại lệ sau mỗi cuộc gọi.

Tất nhiên, đó là một danh sách đầu ra trống không có nhiều hơn một nghĩa. Nếu bạn cần phân biệt giữa một đầu ra trống gây ra bởi đầu vào trống và một đầu ra do chính biến đổi, điều đó hoàn toàn thay đổi mọi thứ.


+1 cho ví dụ cực kỳ hiệu quả (thiếu các câu trả lời hay khác).
djechlin

2

Câu hỏi này thực sự là về ngoại lệ. Nếu bạn nhìn theo cách đó và bỏ qua bộ sưu tập trống như một chi tiết triển khai, câu trả lời rất đơn giản:

1) Một phương thức sẽ đưa ra một ngoại lệ khi không thể tiến hành: không thể thực hiện tác vụ được chỉ định hoặc trả về giá trị chấp nhận.

2) Một phương thức nên bắt một ngoại lệ khi nó có thể tiến hành mặc dù thất bại.

Vì vậy, phương pháp helper bạn không nên "hữu ích" và ném một ngoại lệ trừ khi là không thể làm điều đó của công việc với một bộ sưu tập trống. Hãy để người gọi xác định xem kết quả có thể được xử lý.

Cho dù nó trả về một bộ sưu tập trống hay null, thì khó hơn một chút nhưng không nhiều: nên tránh các bộ sưu tập nullable nếu có thể. Mục đích của một bộ sưu tập nullable là để cho biết (như trong SQL) rằng bạn không có thông tin - ví dụ như một bộ sưu tập trẻ em có thể là null nếu bạn không biết nếu có ai đó, nhưng bạn không biết biết rằng họ không. Nhưng nếu điều đó quan trọng vì một số lý do, có lẽ nó đáng để thêm một biến để theo dõi nó.


1

Phương pháp được đặt tên TransformNodes. Trong trường hợp một bộ sưu tập trống làm đầu vào, việc lấy lại một bộ sưu tập trống là tự nhiên và trực quan, và có ý nghĩa toán học hoàn hảo.

Nếu phương thức được đặt tên Maxvà được thiết kế để trả về phần tử tối đa, thì việc ném NoSuchElementExceptionvào một bộ sưu tập trống là điều tự nhiên , vì tối đa không có gì là không có ý nghĩa toán học.

Nếu phương thức được đặt tên JoinSqlColumnNamesvà được thiết kế để trả về một chuỗi trong đó các phần tử được nối bằng dấu phẩy để sử dụng trong các truy vấn SQL, thì sẽ rất hợp lý khi ném IllegalArgumentExceptionvào một bộ sưu tập trống, vì cuối cùng người gọi sẽ gặp lỗi SQL nếu anh ta sử dụng chuỗi trong một truy vấn SQL trực tiếp mà không cần kiểm tra thêm và thay vì kiểm tra một chuỗi trống được trả về, anh ta thực sự nên kiểm tra bộ sưu tập trống thay thế.


Maxkhông có gì thường là vô cực tiêu cực.
djechlin

0

Hãy lùi lại và sử dụng một ví dụ khác để tính trung bình số học của một mảng các giá trị.

Nếu mảng đầu vào trống (hoặc null), bạn có thể thực hiện hợp lý yêu cầu của người gọi không? Không. Lựa chọn của bạn là gì? Vâng, bạn có thể:

  • hiện tại / trả lại / ném một lỗi. sử dụng quy ước của cơ sở mã cho lớp lỗi đó.
  • tài liệu rằng một giá trị như 0 sẽ được trả về
  • tài liệu rằng giá trị không hợp lệ được chỉ định sẽ được trả về (ví dụ: NaN)
  • tài liệu rằng một giá trị ma thuật sẽ được trả về (ví dụ: tối thiểu hoặc tối đa cho loại hoặc một số giá trị chỉ định hy vọng)
  • tuyên bố kết quả là không xác định
  • tuyên bố hành động không xác định
  • v.v.

Tôi nói cung cấp cho họ lỗi nếu họ đã cung cấp cho bạn đầu vào không hợp lệ và yêu cầu không thể được hoàn thành. Tôi có nghĩa là một lỗi nghiêm trọng từ ngày đầu tiên để họ hiểu các yêu cầu của chương trình của bạn. Rốt cuộc, chức năng của bạn không ở vị trí để đáp ứng. Nếu thao tác có thể thất bại (ví dụ: sao chép một tệp), thì API của bạn sẽ cung cấp cho họ một lỗi mà họ có thể xử lý.

Vì vậy, điều đó có thể xác định cách thư viện của bạn xử lý các yêu cầu và yêu cầu không đúng định dạng có thể thất bại.

Điều rất quan trọng đối với mã của bạn là nhất quán trong cách xử lý các lớp lỗi này.

Danh mục tiếp theo là quyết định cách thư viện của bạn xử lý các yêu cầu vô nghĩa. Quay trở lại một ví dụ tương tự như của bạn - hãy sử dụng một hàm xác định xem một tệp có tồn tại ở một đường dẫn không : bool FileExistsAtPath(String). Nếu khách hàng vượt qua một chuỗi trống, làm thế nào để bạn xử lý tình huống này? Làm thế nào về một mảng trống hoặc null được truyền đến void SaveDocuments(Array<Document>)? Quyết định cho thư viện / codebase của bạn và nhất quán. Tôi tình cờ xem xét các trường hợp này lỗi và cấm khách hàng thực hiện các yêu cầu vô nghĩa bằng cách gắn cờ chúng là lỗi (thông qua một xác nhận). Một số người sẽ mạnh mẽ chống lại ý tưởng / hành động đó. Tôi thấy phát hiện lỗi này rất hữu ích. Nó rất tốt cho việc định vị các vấn đề trong các chương trình - với địa phương tốt cho chương trình vi phạm. Các chương trình rõ ràng và chính xác hơn nhiều (xem xét sự phát triển của cơ sở mã của bạn) và không ghi các chu kỳ trong các chức năng không làm gì cả. Mã này nhỏ hơn / sạch hơn theo cách này và các kiểm tra thường được đẩy ra các vị trí mà vấn đề có thể được đưa ra.


6
Ví dụ cuối cùng của bạn, đó không phải là công việc của chức năng để xác định điều gì là vô nghĩa. Do đó, một chuỗi rỗng sẽ trả về false. Thật vậy, đó là cách tiếp cận chính xác mà File.Exists thực hiện.
Người chơi

@ rmayer06 đó là công việc của nó. hàm được tham chiếu cho phép null, chuỗi rỗng, kiểm tra các ký tự không hợp lệ trong chuỗi, thực hiện cắt chuỗi, có thể cần thực hiện các cuộc gọi hệ thống tệp, có thể cần truy vấn môi trường, v.v. chi phí cao, và họ chắc chắn làm mờ các dòng chính xác (IMO). Tôi đã thấy rất nhiều if (!FileExists(path)) { ...create it!!!... }lỗi - nhiều lỗi trong số đó sẽ bị bắt trước khi cam kết, là các dòng chính xác không bị mờ.
justin

2
Tôi đồng ý với bạn, nếu tên của hàm là File.ThrowException IfPathIsInvalid, nhưng ai trong tâm trí của họ sẽ gọi hàm đó?
Người chơi

Trung bình có 0 mục sẽ trả về NaN hoặc ném ngoại lệ chia cho 0, chỉ vì cách xác định hàm. Một tệp có tên không thể tồn tại, sẽ không tồn tại hoặc sẽ gây ra lỗi. Không có lý do thuyết phục để xử lý các trường hợp đặc biệt.
cHao

Người ta thậm chí có thể lập luận rằng toàn bộ khái niệm kiểm tra sự tồn tại của một tập tin trước khi đọc hoặc viết nó, dù sao cũng là thiếu sót. (Có một điều kiện chủng tộc vốn có.) Tốt hơn là cứ tiếp tục và cố gắng mở tệp, để đọc hoặc với các cài đặt chỉ tạo nếu bạn viết. Nó sẽ thất bại nếu tên tệp không hợp lệ hoặc không tồn tại (hoặc trong trường hợp viết).
cHao

-3

Theo nguyên tắc thông thường, một chức năng tiêu chuẩn sẽ có thể chấp nhận danh sách đầu vào rộng nhất và đưa ra phản hồi về nó, có nhiều ví dụ mà các lập trình viên sử dụng các chức năng theo cách mà nhà thiết kế đã không lên kế hoạch, với suy nghĩ này tôi tin rằng chức năng này phải có thể chấp nhận không chỉ các bộ sưu tập trống mà cả một loạt các kiểu đầu vào và trả về phản hồi một cách duyên dáng, thậm chí có thể là một đối tượng lỗi từ bất kỳ thao tác nào được thực hiện trên đầu vào ...


Nhà thiết kế hoàn toàn sai lầm khi cho rằng một bộ sưu tập sẽ luôn được thông qua và chuyển thẳng sang lặp lại bộ sưu tập nói trên, phải kiểm tra để đảm bảo rằng đối số nhận được phù hợp với kiểu dữ liệu dự kiến ​​...
Clement Mark-Aaba

3
"nhiều loại đầu vào" có vẻ không liên quan ở đây. Câu hỏi được gắn thẻ c # , một ngôn ngữ được gõ mạnh. Đó là, trình biên dịch đảm bảo rằng đầu vào là một bộ sưu tập
gnat

Vui lòng google "quy tắc ngón tay cái", câu trả lời của tôi là một sự thận trọng khái quát rằng với tư cách là một lập trình viên bạn dành chỗ cho những sự cố không lường trước hoặc xảy ra, một trong những điều này có thể bị nhầm lẫn thông qua các đối số chức năng ...
Clement Mark-Aaba

1
Điều này là sai hoặc tautological. writePaycheckToEmployeekhông nên chấp nhận số âm làm đầu vào ... nhưng nếu "phản hồi" có nghĩa là "thực hiện bất kỳ điều gì có thể xảy ra tiếp theo" thì có, mọi chức năng sẽ làm điều gì đó tiếp theo.
djechlin
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.