2011-12-16 30 views
23

Tôi đang đọc sách The Java Programming Language. Trong chương này giải thích trọng phương pháp, nó nói:"Hợp đồng" của một lớp nghĩa là gì

Làm một phương pháp ghi đè (subclass) khó tiếp cận hơn nó được trong siêu lớp sẽ vi phạm hợp đồng của lớp cha ...

Văn bản nói chung là dễ hiểu. Câu hỏi duy nhất của tôi là hợp đồng của siêu lớp là gì? Hợp đồng có nghĩa là gì đối với một lớp học Java?

+0

Xem ** thiết kế theo hợp đồng ** [trên Wikipedia] (https://en.wikipedia.org/wiki/Design_by_contract) và [trên c2.com] (http://wiki.c2.com/?DesignByContract). –

Trả lời

28

Hợp đồng trong trong một lớp Java tương tự như một hợp đồng trong thế giới thực - Về phi kỹ thuật:

Đây là một thỏa thuận rằng lớp sẽ phơi bày phương pháp nhất định, tính chất nhất định, và hành vi nhất định.

Nhiều kỹ thuật, từ here: (đậm thêm bởi tôi)

Nó sẽ không được tốt đẹp nếu tất cả các lớp Java mà bạn sử dụng, bao gồm của riêng mình, sống đến lời hứa của họ? Trong thực tế, nó sẽ không được tốt đẹp nếu bạn thực sự biết chính xác những gì một lớp học đã hứa hẹn? Nếu bạn đồng ý, đọc trên [...]

Design by Contract

Design by kỹ thuật hợp đồng (DBC) phát triển phần mềm đảm bảo phần mềm chất lượng cao bằng cách đảm bảo rằng tất cả các thành phần của một hệ thống sống dậy với kỳ vọng của nó. Là nhà phát triển sử dụng DBC, bạn chỉ định hợp đồng thành phần như là một phần của giao diện của thành phần. Hợp đồng chỉ định thành phần mong đợi của khách hàng và những gì khách hàng có thể mong đợi của nó.

+1

Có sự khác biệt giữa hợp đồng và thông số kỹ thuật không? Có vẻ như hợp đồng chỉ là một thuật ngữ nhân bản cho các thông số kỹ thuật, khi mọi người đồng ý với các hợp đồng, nhưng các máy móc và quy trình được xây dựng theo thông số kỹ thuật. (Ít nhất, trong cách giải thích của tôi về tiếng Anh.) – Buttons840

+4

"Đặc điểm kỹ thuật" có thể được lấy để có nghĩa là các chi tiết của việc thực hiện, tức là các phương pháp và thuộc tính được bảo vệ và riêng tư. "Hợp đồng" thực sự chỉ có nghĩa là phương pháp và tài sản công cộng. – dgvid

+0

Tôi nghĩ về nó như thế này: Trên một dự án phần mềm, nơi bạn thuê một nhà cung cấp, có một hợp đồng cho công việc được thực hiện (thường khá chung chung), và (hy vọng) một tài liệu yêu cầu cụ thể chi tiết hơn. Các đặc điểm kỹ thuật là giống như các tài liệu yêu cầu, trong đó nó thực hiện hợp đồng, với các chi tiết cụ thể về cách thực hiện. – David

2

Điều đó có nghĩa là phương pháp ghi đè phương thức trên lớp cha hoặc giao diện phải hoạt động theo cách hợp đồng xác định.

Nếu không, kết quả sẽ không được xác định.

3

"Hợp đồng" của lớp học là giao diện công khai hoặc ít nhất là giao diện nếu trình bày cho các lớp ngoài chính nó.

Điều này có nghĩa là nó bao gồm mọi phần tử (phương pháp, trường, hàm tạo, v.v.) mà các lớp khác có thể sử dụng.

0

Có nhiều nguyên tắc bạn nên tuân theo khi lập trình bằng java hoặc bằng bất kỳ ngôn ngữ lập trình nào. Các nguyên tắc phụ thuộc vào ngôn ngữ lập trình bạn đang sử dụng. Bạn có thể tìm hiểu thêm về hợp đồng trong Design by contract wikipedia page

0

trong thuật ngữ đơn giản nó có nghĩa là bạn sẽ phá vỡ các điều kiện của lớp cha nếu u làm cho mã override ít accesible

4

Hợp đồng loại (lớp, giao diện, enum) là, tốt, hợp đồng loại này hứa hẹn tuân thủ.Trạng thái:

  • thông số được chấp nhận cho hàm tạo và/hoặc phương pháp thuộc loại này là gì;
  • những gì bạn nên và/hoặc không nên mong đợi loại này sẽ làm. Ví dụ, nó có thể nói rằng bạn sẽ mong đợi lớp này là thread-safe hoặc không thread-safe;
  • những bất biến được loại này hỗ trợ là gì. Ví dụ, gõ phương thức addData(float) của lớp MathAverage tính giá trị trung bình của đầu vào của nó có thể cho biết rằng mỗi khi bạn gọi tới số add(float), bạn sẽ phải gọi tới số MathAverage.getAverage() để trả lại giá trị trung bình chính xác của đầu vào hiện tại.
  • nói chung, loại của bạn có thể chỉ định bất kỳ ràng buộc nào cho tất cả các loại phụ của nó. Ví dụ: có thể nói "không có phương pháp nào trong loại này phải mất hơn 1 giây để thực thi".

Hợp đồng được chỉ định ở dạng tự do trong javadoc loại. Có một số công cụ/thực hành để thực thi các hợp đồng, nhưng chúng bị hạn chế, chính xác bởi vì hợp đồng có thể tùy ý, hoặc thậm chí, tự mâu thuẫn, trong trường hợp lỗi lập trình viên.

Vì phân loại phụ (phân lớp) có thể mở rộng/sửa đổi hành vi của các phương thức siêu kiểu theo cách tùy ý, nó có thể vi phạm một số phần của hợp đồng siêu loại. Ví dụ về điều này sẽ mở rộng HashMap, chấp nhận các giá trị và khóa null, với một số triển khai ngăn cấm các giá trị null trong cuộc gọi đến các phương thức của nó.

khía cạnh quan trọng khác về hợp đồng loại là kiểu phụ có thể có mạnh hợp đồng (bao gồm tập hợp con của các ràng buộc trong hợp đồng loại), nhưng không thể có yếu hợp đồng (bao gồm superset của những hạn chế trong hợp đồng loại của). Ví dụ: nếu phương thức 'doX (n)' của loại của bạn hứa hẹn lấy thời gian O(n) (tuyến tính), 'doX (n)' trong loại phụ có thể mất O(1) (không đổi), nhưng không thể mất thời gian O(n^2).

0

Đó là một biểu thức xuất phát từ ý tưởng về hợp đồng trong "thế giới thực".

Về cơ bản, nếu bạn phá vỡ hợp đồng của mình với một lớp học, thì bạn không cần phải cư xử theo cách bạn mong đợi. Theo một hướng khác, đó là lời hứa của lớp rằng nếu bạn tuân theo các quy tắc mà nó đặt ra, nó sẽ hoạt động theo cách API của nó nói.

Một ví dụ phổ biến về hợp đồng trong Java là ghi đè equals() khi hashCode() bị ghi đè. Hai đối tượng được coi là bằng nhau, theo hợp đồng, có cùng mã băm. Có thể viết mã đúng cú pháp mà không tuân theo điều này, nhưng nó có thể không hoạt động đúng, và đó là lỗi của lập trình viên đã phá vỡ hợp đồng.

0

Hợp đồng của một lớp hoặc giao diện, trong Java hoặc bất kỳ ngôn ngữ OO nào khác, thường đề cập đến các phương thức hoặc (hoặc trường) hoặc thuộc tính (hoặc trường hoặc thuộc tính) công khai của giao diện lớp đó cùng với mọi nhận xét hoặc tài liệu áp dụng cho các phương thức và thuộc tính công khai đó.

Trong trường hợp mối quan hệ giữa một lớp và phân lớp, mọi phương thức hoặc thuộc tính được bảo vệ sẽ được coi là "được hiển thị công khai", theo nghĩa là chúng được tiếp xúc với lớp con.

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