Làm thế nào tôi có thể biết nếu phần mềm được kết nối cao?


16

Tôi quen thuộc với thuật ngữ "được ghép nối cao" nhưng tôi tò mò liệu có dấu hiệu nào không (có mùi mã) có thể chỉ ra rằng mã được ghép nối cao. Tôi hiện đang làm việc với Java EE nhưng điều này có thể áp dụng cho bất kỳ ngôn ngữ nào.

Biên tập:

Trong trường hợp bất kỳ ai quan tâm, bài viết này nghe có vẻ hữu ích: Theo đuổi chất lượng mã: Hãy coi chừng cặp đôi chặt chẽ! (IBM)


1
Nguyên tắc nhỏ: Nếu bạn thực hiện một thay đổi nhỏ, nhấn biên dịch và có thời gian để đi vệ sinh, nó quá chặt chẽ.
Uri

Câu trả lời:


15

Theo tôi, chỉ số số một về các mô đun được ghép nối kém là phụ thuộc song phương. Ví dụ, Module1 gọi một số chức năng trong Module2 và Module2 gọi một số chức năng trong Module1.

Hầu hết các giao diện nên đơn hướng. Nếu mô-đun được gọi cần truyền một số thông tin đến mô-đun gọi không được trả lại như một phần của cuộc gọi thì nó nên sử dụng một số loại cơ chế chuyển tin nhắn hoặc cơ chế kích hoạt sự kiện như hàng đợi tin nhắn. Lý tưởng nhất, giao diện xử lý chuyển tin nhắn nên được chuyển qua trong một số quá trình khởi tạo hoặc đăng ký. Điều này hoàn toàn trừu tượng hóa giao diện theo cách mà mô-đun không thực sự quan tâm sự kiện dành cho ai ... do đó nó được tách rời.

Một dấu hiệu khác là khi một mô-đun liên tục gọi một số mô-đun khác cho một số tập dữ liệu cụ thể. Điều này sẽ khiến bạn đặt câu hỏi ai thực sự nên sở hữu tập dữ liệu. Tại sao mô-đun này trong câu hỏi luôn cần phải xem dữ liệu thuộc về một số mô-đun khác?

Một công cụ thứ ba để nói là tự hỏi: "Tôi có thể rút mô-đun này ra và thay thế nó mà không yêu cầu thay đổi các mô-đun khác không.

Đây không phải là một danh sách đầy đủ, nhưng chúng là ba điều hàng đầu tôi tự hỏi khi thiết kế phần mềm.


2
+1 cho các phụ thuộc song phương. Họ là trái tim đen tối của tà ác.
Adam Crossland

16

Thiết kế cũ có câu: "Bạn có thể chạm vào bạn bè của mình và bạn có thể chạm vào những người bạn của mình. Nhưng bạn không thể chạm vào những người bạn của bạn." Đó là khớp nối trong một tóm tắt.

Các dấu hiệu của mã được ghép nối cao bao gồm các giao diện rất lớn cho phép mọi người biết về các chi tiết riêng tư của việc triển khai và các đối tượng dường như "biết nhiều về nhau". Có những công cụ để phân tích tự động sẽ gắn cờ mã trông giống với bạn. Xem http://www.scitools.com/features/metricsintro.php để biết ngẫu nhiên. (Tôi không biết nó hoạt động tốt như thế nào. Nó chỉ tăng khá cao trong một tìm kiếm Google.)


7

Hãy thử viết một số bài kiểm tra đơn vị cho các lớp. Nếu bạn không thể dễ dàng kiểm tra các lớp mà không cần phải tạo / giả định vô số các lớp hỗ trợ hoặc db / ui thì đó là dấu hiệu chắc chắn của khớp nối / phụ thuộc xấu.

Đây cũng là một trong những cách chữa tốt nhất, nhưng bạn phải thực hiện trong quá trình mã hóa (như TDD) để giữ cho bạn trung thực.


+1. Peeve yêu thích của tôi không thể tự khởi tạo đối tượng kinh doanh VÀ xác thực tất cả các quy tắc kinh doanh của chính nó. Thông thường, người ta sẽ thấy một quy tắc "giá trị bắt buộc", ví dụ, được triển khai trong giao diện người dùng máy khách nhưng không phải trong chính đối tượng. Sẽ ổn khi đặt nó trong UI (để xem xét hiệu suất, giả sử) nhưng nó PHẢI nằm trong chính đối tượng kinh doanh.
radarbob

6

Dấu hiệu rõ ràng với tôi là mọi thứ đều công khai.

Dấu hiệu khác là vi phạm Luật của Demeter - quá mức này.SomeObj.SomeProp.SomeProp tham chiếu trên các giao diện không trôi chảy.

Tôi đã từng thấy những gì tôi đã từng gọi là "lớp học múa rối" đã xây dựng một biểu mẫu nhập dữ liệu một cách nhanh chóng. Nó có một số vi phạm thiết kế phần mềm khác nên việc ghép nối quá mức là mối quan tâm ít nhất.

Khi lấy dữ liệu từ các điều khiển mà nó tạo ra, nó đã làm như vậy:

var control = activeDataEntryControl as CustomTextBox;
if (control != null)
   result = control.NestedTextBox.Text;

/* several other controls */

Ồ Bạn đã tạo ra nó, và nó null ??????
Michael K

Nó có thể là một loại khác nhau. Đó chỉ là một trong nhiều trong một vòng lặp.
Austin Salonen

5

Các Ripple Effect .

Mọi thay đổi đều có hiệu ứng gợn qua tất cả các mô-đun được ghép chặt chẽ.

Nguyên tắc "Đóng mở" đã bị vi phạm ở chỗ nó không được đóng đúng cách và thay đổi rò rỉ ra ngoài.


+1 cho Ripple. Làm việc với các quái vật kết hợp chặt chẽ khiến tôi muốn tiếp cận Ripple.
Adam Crossland

@Adam Crossland: Tôi không hiệu ứng Laphroaig sẽ hoạt động tốt - quá đắt. Nhưng Hiệu ứng Thunderbird có thể đã tốt.
S.Lott

3

Kiểm tra số lượng # bao gồm / nhập khẩu, vv giữa các lớp / gói / dlls / jars / whatnots. Cố gắng vẽ một biểu đồ này, về mặt tinh thần, bằng tay hoặc sử dụng một số loại công cụ.

  • Nếu biểu đồ đó dày đặc (nghĩa là nhiều kết nối ở khắp mọi nơi), thì hệ thống của bạn là nguyên khối và được ghép nối cao.
  • Nếu nó được phân chia rõ ràng thành các lớp, không có kết nối giữa các lớp / máng và rất ít kết nối, bạn có một hệ thống mô-đun và tách rời.

0

Nếu bạn thấy không thể thực hiện một tính năng vì bạn không biết trách nhiệm cụ thể sẽ đi đến đâu, thì hệ thống của bạn được kết nối quá chặt chẽ.


0

Đối với các dấu hiệu rất cơ bản, bạn có thể xem xét việc tìm kiếm số lượng giao diện và cách sử dụng giữa các lớp của các gói khác nhau (thường là mã được ghép lỏng lẻo chứa các giao diện và có sự tương tác trực tiếp hạn chế giữa các lớp riêng lẻ trong các gói khác nhau), số lượng tên lớp có thể là Được sử dụng để nhóm các lớp khác (trong mã tương tác lỏng lẻo tương tác thực tế giữa các lớp có các công việc khác nhau được thực hiện bởi các hàm giao diện hoặc bởi các hàm của các lớp phổ biến / nhóm khác) hoặc đánh số các biến công khai trong các lớp (ít lỏng hơn / thậm chí không có biến công khai ).


0

Khá nhiều tất cả các mùi mã cho thấy khớp nối thừa trong một số cách. Tôi cho rằng mùi mà hầu hết chỉ ra sự ghép đôi mặc dù có thể là "Sự thân mật không phù hợp" (mùi yêu thích của tôi).

Tôi cho rằng một phương pháp hợp lý khác để đo lường là đếm các dòng trong sơ đồ UML của bạn. Nếu bạn có N đối tượng và N ^ N (hoặc nhiều hơn) giữa chúng, thì mã của bạn được ghép nối tối đa. N dòng có thể sẽ là tối thiểu như bạn có thể nhận được.

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.