2011-03-15 35 views
5

Nên chọn loại nào trong số hai loại này?Lớp cơ sở so với Lớp tiện ích

Có một số phương pháp được gọi bằng lớp A, B và C.

các phương pháp đó có nên được đóng gói trong một lớp D (cơ sở của A, B và C)?

HOẶC

các phương pháp đó có nên được đóng gói trong một lớp học U và các lớp khác creats đó là đối tượng sử dụng các phương pháp theo yêu cầu.

Trên quyết định cơ bản nào nên được thực hiện?

Cảm ơn.

+4

Có mối quan hệ khái niệm nào giữa các lớp A, B và C không? –

+0

Làm cách nào để tạo giao diện và thực hiện bằng A, B, C? –

+0

@p: chỉ rằng chúng xây dựng dữ liệu được sử dụng bởi lớp D. A yêu cầu đầu vào khác với các lớp khác. @Srinivas: việc thực hiện các phương pháp đó hoàn toàn giống với A, B và C. – Azodious

Trả lời

9

Bạn nên tạo lớp tiện ích static.

Chỉ sử dụng thừa kế nếu nó thực sự có ý nghĩa — nếu A, B, và C thực một D.

+0

vâng, tôi đoán vậy. D có các phương thức gọi một số thuật toán của ba loại. A, B và C xây dựng dữ liệu cụ thể cho thuật toán và gọi những phương thức phổ biến đó để thực thi. – Azodious

+0

@Azo: Chi tiết luôn hữu ích. Trong trường hợp đó, có lẽ bạn nên sử dụng thừa kế, với phương thức 'abstract' được ghi đè bởi' A', 'B' và' C'. – SLaks

+0

Tôi hoàn toàn đồng ý với điểm thứ hai của bạn, nhưng tôi chỉ khuyên bạn nên sử dụng lớp tiện ích tĩnh mà phương thức tiện ích không có trạng thái (tức là không có biến tĩnh) và không thực hiện thao tác nào với tác dụng phụ (tệp IO hoặc hoạt động cơ sở dữ liệu v.v.) . Nếu bạn đang thử nghiệm đơn vị A, B và C, nó (hầu như) không thể tách chúng ra khỏi một lớp tiện ích tĩnh với các đối tượng giả. Tốt hơn hết là nên sử dụng lớp tiện ích không tĩnh được chuyển tới A/B/C thông qua quá trình tạo hàm dựng. Sau đó, bạn mã là cấu hình cao và mua lại hành vi thông qua tập hợp. – sheikhjabootie

2

Tôi có xu hướng bỏ kế thừa trừ khi có mối quan hệ rõ ràng là mối quan hệ. Tôi nghi ngờ từ mô tả của bạn ở trên rằng đây không phải là trường hợp. giải pháp ưa thích của tôi sẽ là:

  1. tiêm một thể hiện của một lớp tiện ích vào một bạn, B, C
  2. có A, B, C nhanh chóng các lớp tiện ích thích hợp

Ưu điểm việc tiêm lớp là bạn có thể cung cấp các triển khai khác nhau một cách trivially. Điều này đặc biệt hữu ích để thử nghiệm. Singletons hoặc các lớp với các phương thức tĩnh có xu hướng gây ra các vấn đề cho cùng một lý do - bạn không thể dễ dàng ghi đè hoặc thay thế chúng.

3

Tôi sẽ căn cứ vào quyết định về những gì các phương pháp đang làm, nếu chúng làm những việc cụ thể cho các lớp A, B và C thì chúng phải ở trong lớp cơ sở. Điều này giúp giữ mã sạch, bằng cách ẩn chức năng liên quan đến lớp học khỏi phần còn lại của hệ thống. (tất nhiên, tôi giả định rằng A, B và C hoặc đã kế thừa từ D, hoặc rõ ràng là có liên quan)

Nếu họ đang làm việc với các loại khác, vốn không có trong A, B và C làm, sau đó để tối đa hóa cơ hội để tái sử dụng, họ nên ở trong một lớp tiện ích.

Nếu chúng đang làm việc với các loại khác dành riêng cho loại khác (ví dụ: in một ngày giờ đẹp), hãy xem xét phương pháp mở rộng cho loại đó.

+1

+1: Bạn đánh tôi với nó. Như SLaks đề cập đến nó cũng có vẻ như OP không nhận thức được các chức năng tĩnh. Có lẽ đáng nói đến cũng như cho lớp tiện ích. –

0

Sử dụng lớp cơ sở Nếu bạn định viết một số logic chỉ phụ thuộc vào lớp cơ sở - thì có ý nghĩa khi tạo lớp cơ sở. Trong trường hợp đó, lớp dẫn xuất của bạn nên được thay thế hoàn toàn cho lớp cơ sở của bạn. Không nên có bất kỳ logic chuyển đổi nào để kiểm tra loại dẫn xuất và hành động tương ứng.Xem Liskov Substitution Nguyên tắc: http://en.wikipedia.org/wiki/Liskov_substitution_principle

Sử dụng Utility Lớp Một số ngôn ngữ có giới hạn mà họ không hỗ trợ đa kế thừa. Nếu bạn đã có một lớp cơ sở có ý nghĩa thì bạn cần phải đi đến lớp tiện ích. Ngoài ra, khi bạn đang sử dụng thừa kế của bạn đang tạo ra sự kết nối chặt chẽ giữa từ lớp dervied đến lớp cơ sở.

Tôi sẽ đi đến lớp cơ sở nếu lớp dẫn xuất có thể thay thế tự nhiên cho lớp cơ sở của nó. Nếu mục đích là chỉ để chia sẻ một số mã có thể tái sử dụng giữa các lớp, thì nó có ý nghĩa hơn để đi với lớp tiện ích.

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