2014-09-05 21 views
5

Tôi đang tìm các quy ước đặt tên của mình khá khó chịu. Tôi dường như đang sử dụng lại tên cụ thể của trẻ quá nhiều. Trong ví dụ của tôi dưới đây, tôi có một Widget có một kết nối có cấu hình. Mỗi đối tượng này có các lớp chuyên biệt cho các kiểu Foo và Bar.Mẫu Thừa kế

Vì vậy, FooWidget của tôi có một Foo-Connection có cấu hình Foo. Điều tương tự đối với Bar. Trong C++ tôi đã kết thúc với chín tập tin tiêu đề khác nhau.

  • widget.h
  • connection.h
  • config.h
  • foo_widget.h
  • foo_connection.h
  • foo_config.h
  • bar_widget.h
  • bar_connection. h
  • bar_config.h

Tôi không thể không nhìn vào điều này một cảm giác như nó không đúng. Bản năng của tôi cho tôi biết một cái gì đó cần phải được thay đổi. Nó giống như có một mẫu thiết kế ở đâu đó để được tận dụng. Nhưng tôi không thể tìm ra giải pháp tốt hơn.

Vì vậy, tôi đoán câu hỏi của tôi là như sau: Có mẫu thiết kế nào sẽ cải thiện thiết kế này không?

enter image description here

- Tôi gặp khó khăn từ ngữ câu hỏi của tôi một cách chính xác. Xin lỗi, tôi sẽ cập nhật khi câu hỏi tự nó trở nên rõ ràng hơn.

+1

Trong hầu hết các mẫu phổ biến, trông giống như 'Cầu' khi bạn cố gắng tách giao diện của đối tượng ra khỏi triển khai. Liên kết: http://www.dofactory.com/net/bridge-design-pattern. Tôi không biết nếu nó sẽ cải thiện thiết kế, nhưng ít nhất nó có thể cho thấy rằng mô hình của bạn là phổ biến hơn bạn có thể nghĩ. Trừ khi bạn quan tâm đến việc tạo ra các đối tượng, thì bạn cũng nên xem xét Nhà máy Tóm tắt. – Pieter21

+2

Bạn không thể đưa ra lời khuyên, chỉ cần nhìn vào cấu trúc. Chúng ta cần một số thông tin về vai trò của các lớp này và những gì chúng được cho là phải làm và cách chúng tương tác. Nếu đây là một mẫu MVC, tôi không thể nhìn thấy bất cứ điều gì sai với nó từ góc độ này. –

+0

Cầu thang lên thiên đàng. –

Trả lời

0

Trước hết, không có gì là sai bằng cách thực hiện theo cách đó. Nhiều người thích đặt một lớp cho mỗi tiêu đề, nói chung. Nếu bạn không thích xem nhiều tiêu đề, bạn có thể sắp xếp chúng theo thư mục hoặc bộ lọc cây dự án, v.v.

Đây là một câu hỏi về phong cách. Miễn là chức năng bị ảnh hưởng, tùy chọn tốt nhất là chức năng của cảm giác vui nhộn mà bạn có và cũng giống như vậy đối với những người hỗ trợ mã của bạn trên đường. Có lẽ câu trả lời này có thể làm cho cảm giác buồn cười đó đi xuống cho bạn, hoặc có thể không.

Thứ hai, điều này phụ thuộc rất nhiều vào việc sử dụng từng lớp. Nếu các lớp FooBar nhỏ, chúng có thể được đặt trong tiêu đề chứa lớp đóng gói. Có lẽ thêm một tuyên bố về phía trước vì lợi ích của lớp cha, và kết thúc khai báo nó ở dưới cùng của tiêu đề. Điểm thưởng nếu tất cả chúng đều liên quan (ví dụ: FooConnection là một lớp con của Foo) bởi vì điều này rút ngắn không gian khai báo.

Nếu chúng là các lớp tương đối nhỏ, có thể không có hại trong việc khai báo các lớp học FooBar trong định nghĩa lớp cơ sở của chúng. Sau đó, không có FooConnection - thực tế là Connection::FooConnection. Trong trường hợp này Connection không chỉ xác định cơ sở cho FooConnection, nó sở hữu định nghĩa của nó. Điều đó có nghĩa là mỗi khi bạn sử dụng mã FooConnection trong mã của mình, bạn đang suy nghĩ trong ngữ cảnh của Connection.Tôi hiếm khi tự làm, chủ yếu là vì tôi không thích gõ Connection:: mọi lúc, nhưng cũng vì có quá ít trường hợp tôi chỉ sử dụng một lớp trong một ngữ cảnh.

Nếu các lớp được đóng gói là protected hoặc private, thì chúng chỉ được sử dụng bởi chính lớp cha mẹ (và friend lớp và có thể là lớp con, bạn có gì). Sau đó, vì bối cảnh hạn chế được thiết lập và nếu khai báo lớp nhỏ (< 50 hoặc < 100 dòng), bạn có thể khai báo FooConnectionBarConnection trong phạm vi Connection và vẫn duy trì khả năng đọc.

Điểm thưởng: nếu bạn kết thúc khai báo lớp bên trong lớp học, bạn có thể tận dụng việc tách biệt không gian tên. Tôi không biết sử dụng các lớp này, nhưng tôi đoán rằng FooConnection không phải là kết nối, mà là một số Foo thuộc về một số Collection. Vì vậy, bạn có thể khai báo một lớp Foo và một lớp Bar cho mỗi số Widget, ConnectionConfig.

+0

Nếu biểu đồ OP tuân theo quy ước bình thường của [sơ đồ lớp UML] (http://en.wikipedia.org/wiki/Class_diagram) thì thừa kế 'Foo' và' Bar' ** từ 'Widget'. 'Widget' không" đóng gói "' Foo' và 'Bar'. Và 'FooConnection' là một' Kết nối'. Thừa kế là định nghĩa của "is-a". –

+0

Đã chỉnh sửa để làm rõ từ ngữ của tôi. Trong đoạn văn đó tôi đã nghĩ đến một ví dụ cụ thể trong đó một lớp cơ sở đóng gói (hoặc * yield *) các cá thể lớp con. Từ ngữ của tôi dường như giới hạn cuộc thảo luận về định nghĩa của lớp con đó cho trường hợp đó. – Gutblender

0

Tôi không nghĩ rằng có bất cứ điều gì sai với cấu trúc của các lớp học của bạn nhưng không nhìn thấy những gì các lớp học làm nó sẽ là khó để đưa ra lời khuyên về cách cải thiện thiết kế của bạn.

Tôi nghĩ rằng đó là phong cách tốt để có một tệp tiêu đề cho mỗi lớp. Nó giúp mọi việc trở nên dễ dàng hơn và bạn có thể dễ dàng sử dụng các thư mục (hoặc các bộ lọc trong IDE của bạn) để tổ chức các tệp của bạn. Ví dụ: bạn có thể thấy việc cấu trúc các tệp của mình dễ dàng hơn:

|--Foo 
    |--foo_widget.h 
    |--foo_connection.h 
    |--foo_config.h 
|--Bar 
    |--bar_widget.h 
    |--bar_connnection.h 
    |--bar_config.h 
|--widget.h 
|--connection.h 
|--config.h