2010-05-28 41 views
17

Những ngày này tôi được sử dụng để kiểm tra từng điều kiện tiên quyết cho mọi chức năng kể từ khi tôi có thói quen từ một khóa học lập trình hệ điều hành trở lại uni.Làm điều kiện tiên quyết LUÔN phải được kiểm tra?

Mặt khác, tại khóa học kỹ thuật phần mềm, chúng tôi được dạy rằng điều kiện tiên quyết chỉ được kiểm tra một lần, ví dụ, nếu hàm được giao cho hàm khác, hàm đầu tiên sẽ kiểm tra chúng nhưng kiểm tra lại trong cái thứ hai là dư thừa.

Tôi thấy điểm dự phòng, nhưng tôi chắc chắn cảm thấy an toàn hơn khi luôn kiểm tra chúng, cộng với bạn không phải theo dõi vị trí đã kiểm tra trước đó.

Thực tiễn tốt nhất ở đây là gì?

Trả lời

11

Tôi chưa thấy quy tắc "cứng và nhanh" về cách kiểm tra điều kiện tiên quyết, nhưng tôi thường coi nó như tài liệu phương pháp. Nếu nó được công khai phạm vi, tôi khẳng định rằng các điều kiện tiên quyết được đáp ứng. Logic đằng sau điều này sẽ là phạm vi ra lệnh rằng bạn đang mong đợi tiêu thụ trên quy mô rộng hơn và ít ảnh hưởng hơn.

Cá nhân, nỗ lực đặt khẳng định xung quanh phương pháp riêng tư là điều tôi dự trữ cho các phương pháp "nhiệm vụ quan trọng", về cơ bản là những phương pháp thực hiện nhiệm vụ quan trọng, tuân theo yêu cầu tuân thủ bên ngoài hoặc không thể khôi phục được sự kiện ngoại lệ. Đây chủ yếu là "các cuộc gọi phán xét".

Thời gian lưu có thể được tái đầu tư vào đơn vị toàn diện và tăng cường kiểm tra tích hợp để thử và loại bỏ các vấn đề này và đặt công cụ để giúp thực thi chất lượng của xác nhận đầu vào vì nó sẽ được khách hàng tiêu thụ, cho dù là một lớp trong tầm kiểm soát của bạn hay không.

3

Theo kinh nghiệm của tôi, nó phụ thuộc vào đóng gói của bạn. Nếu chức năng bên trong là riêng tư thì bạn có thể chắc chắn rằng các điều kiện tiên quyết của nó được thiết lập.

Đoán đó là tất cả về Luật Demeter, chỉ nói chuyện với bạn bè của bạn và v.v.

Làm cơ sở để thực hành tốt nhất, nếu cuộc gọi được công khai, bạn nên kiểm tra đầu vào của mình.

+0

Câu trả lời hay! Tôi đang tìm ai đó để nói điều gì đó về Luật Demeter. Đó là chính xác lý do tại sao trong xác nhận Java chỉ được sử dụng để kiểm tra điều kiện tiên quyết trong phương pháp riêng, vv – latenightcode

0

Cách tốt nhất là luôn kiểm tra chúng.

+4

* * Thực hành tốt nhất của bạn là luôn luôn kiểm tra chúng. ;-) –

4

Tôi nghĩ điều đó phụ thuộc vào cách tổ chức nhóm: kiểm tra các yếu tố đầu vào đến từ bên ngoài nhóm của bạn.

  • Kiểm tra nguyên liệu đầu vào từ người dùng cuối cùng
  • Kiểm tra nguyên liệu đầu vào từ các thành phần phần mềm được viết bởi các đội khác
  • đầu vào ủy thác nhận từ bên trong thành phần của riêng bạn/trong nhóm của riêng bạn.

Lý do cho việc này là để hỗ trợ và bảo trì (tức là sửa lỗi): khi có báo cáo lỗi, bạn có thể biết nhanh nhất có thể biết thành phần nào bị lỗi, nghĩa là nhóm nào sẽ gán lỗi.

+0

Tôi nghĩ rằng làm cho rất nhiều ý nghĩa. Nó phụ thuộc rất nhiều vào việc bạn đang viết mã cho ai. – Paddy

4

nếu một chức năng được ủy thác cho chức năng khác, chức năng đầu tiên nên kiểm tra chúng, nhưng kiểm tra chúng một lần nữa trong thứ hai là không cần thiết.

Điều gì sẽ xảy ra nếu bạn thay đổi cách các chức năng đó gọi cho nhau? Hoặc bạn giới thiệu các yêu cầu xác thực mới trong hàm thứ hai, mà người đầu tiên ủy quyền? Tôi muốn nói là an toàn hơn để luôn kiểm tra chúng.

+0

Đây chính xác là những gì tôi nghĩ và do đó đặt câu hỏi. Tuy nhiên tôi không chắc bây giờ sau khi nhìn thấy những câu trả lời khác. Cho đến nay tôi nghĩ rằng cách tiếp cận của joseph ferris 'có rất nhiều ý nghĩa. – Pin

+0

@Pin Đó là câu hỏi về sự cân bằng. Khi tái cấu trúc, một số chức năng riêng có thể được di chuyển và thay đổi phụ thuộc của chúng, trong trường hợp tốt hơn là không kiểm tra điều kiện tiên quyết của chúng, vì chúng sẽ được xử lý bởi các phương thức công khai gọi chúng. Mặt khác, các phương thức riêng tư trước đây có thể trở thành công khai trong giai đoạn mở rộng API, vì vậy chúng sẽ cần kiểm tra điều kiện tiên quyết của chúng. – luvieere

2

Tôi nghĩ rằng thực hành tốt nhất là thực hiện các kiểm tra này chỉ khi chúng sẽ thất bại vào một ngày nào đó. Nếu sẽ giúp đỡ khi bạn làm như sau.

Gỡ rối

không có điểm để kiểm tra xem chúng khi một số chức năng riêng trong một module, trong đó có một nhà duy trì duy nhất, trao đổi dữ liệu. Tất nhiên, có những ngoại lệ, đặc biệt nếu ngôn ngữ của bạn không có hệ thống kiểu tĩnh hoặc dữ liệu của bạn là "stringly typed".

Tuy nhiên, nếu bạn hiển thị API công khai, một ngày nào đó, người nào đó sẽ không làm điều kiện tiên quyết của bạn. Hơn nữa là người duy trì mô-đun gọi điện từ bạn (trong cấu trúc tổ chức và ở vị trí thực tế), càng có nhiều khả năng nó sẽ xảy ra. Và khi nó xảy ra, một tuyên bố rõ ràng về sự thất bại điều kiện tiên quyết, với một đặc điểm kỹ thuật nơi nó xảy ra, có thể tiết kiệm thời gian gỡ lỗi. The Law of Leaky Abstractions vẫn còn đúng ...

QA

kiện tiên quyết thất bại giúp QA để gỡ lỗi các xét nghiệm của họ. Nếu một đơn vị kiểm tra cho một mô-đun gây ra các mô-đun để mang lại thất bại điều kiện tiên quyết, nó có nghĩa là thử nghiệm là không chính xác, không phải mã của bạn. (Hoặc, kiểm tra điều kiện tiên quyết của bạn là không chính xác, nhưng điều đó ít có khả năng hơn).

Nếu một trong các phương tiện thực hiện QA là phân tích tĩnh, thì kiểm tra điều kiện tiên quyết, nếu chúng có ký hiệu cụ thể (ví dụ: chỉ những séc này sử dụng macro assert_precondition) cũng sẽ trợ giúp. Trong phân tích tĩnh, điều quan trọng là phải phân biệt các lỗi đầu vào và mã nguồn không chính xác.

Documentation

Nếu bạn không có nhiều thời gian để tạo ra tài liệu, bạn có thể thực hiện viện trợ mã của bạn văn bản mà đi kèm với nó. Kiểm tra điều kiện tiên quyết rõ ràng và rõ ràng, được nhận thức riêng biệt với phần còn lại của việc thực hiện, "tài liệu" đầu vào có thể ở một mức độ nào đó. (Một cách khác để ghi lại mã của bạn theo cách này là viết các bài kiểm thử đơn vị).

2

Như với mọi thứ, hãy đánh giá các yêu cầu của bạn để tìm ra giải pháp tốt nhất cho từng tình huống.

Khi điều kiện tiên quyết dễ kiểm tra hơn ("con trỏ không phải là rỗng"), bạn cũng có thể làm điều đó thường xuyên. Điều kiện tiên quyết khó kiểm tra ("điểm đến một chuỗi vô hiệu hợp lệ") hoặc tốn kém về thời gian, bộ nhớ hoặc các tài nguyên khác có thể được xử lý theo một cách khác. Sử dụng Pareto principle và thu thập trái cây treo thấp.

// C, C++: 
void example(char const* s) { 
    // precondition: s points to a valid null-terminated string 
    assert(s); // tests that s is non-null, which is required for it to point to 
    // a valid null-terminated string. the real test is nearly impossible from 
    // within this function 
} 

Điều kiện tiên quyết đảm bảo là trách nhiệm của người gọi người gọi. Do đó, một số ngôn ngữ cung cấp một cấu trúc "khẳng định" có thể được bỏ qua (ví dụ: xác định NDEBUG cho C/C++, chuyển đổi dòng lệnh cho Python) để bạn có thể thử nghiệm thêm các điều kiện tiên quyết trong các bản dựng đặc biệt mà không ảnh hưởng đến hiệu suất cuối cùng. Tuy nhiên, làm thế nào để sử dụng khẳng định có thể là một cuộc tranh luận nóng — một lần nữa, tìm ra yêu cầu của bạn và nhất quán.

4

tôi đã thực hiện các thói quen phân biệt giữa kiểm trakhẳng định điều kiện tiên quyết, tùy thuộc (như những người chỉ ra trong các ý kiến) về việc có một cuộc gọi đến từ bên ngoài (ngoại lệ được kiểm soát, có thể xảy ra) hoặc bên trong (khẳng định, không nên xảy ra).

Lý tưởng nhất, hệ thống sản xuất sẽ không có hình phạt của các xác nhận, và bạn thậm chí có thể sử dụng một cơ chế thiết kế theo hợp đồng (TM) để xả các xác nhận tĩnh.

+2

Tôi đồng ý. Tôi tin rằng việc khẳng định điều kiện tiên quyết nên được thực hiện ngay cả trong các phương pháp riêng (giả sử nó không ảnh hưởng đến hiệu năng) vì nó giúp tránh lỗi. –

2

Đó là một câu hỏi cũ, nhưng không, điều kiện tiên quyết không cần phải được kiểm tra mỗi lần. Nó thực sự phụ thuộc.

Ví dụ: nếu bạn có tìm kiếm nhị phân trên vectơ. Điều kiện tiên quyết là vector được sắp xếp. Bây giờ, nếu bạn kiểm tra mỗi lần nếu véc-tơ được sắp xếp thì sẽ mất một thời gian tuyến tính (đối với mỗi véc-tơ), vì vậy nó không hiệu quả. Khách hàng phải nhận thức được điều kiện tiên quyết và chắc chắn để đáp ứng điều kiện tiên quyết đó.

Các vấn đề liên quan