2011-05-16 36 views
20

Tôi đang tìm kiếm tại LCOM số liệu như trình bày ở đây,Tại sao Thiếu gắn kết các phương pháp (LCOM) Bao gồm Getters and Setters

http://www.ndepend.com/Metrics.aspx

Vì vậy, chúng ta đang nói đến một vài điều,

1) A class is utterly cohesive if all its methods use all its instance fields 
2) Both static and instance methods are counted, it includes also constructors, properties getters/setters, events add/remove methods 

Nếu tôi nhìn vào một lớp học như thế này,

public class Assessment 
{ 
    public int StartMetres { get; set; } 
    public int EndMetres { get; set; } 
    public decimal? NumericResponse { get; set; } 
    public string FreeResponse { get; set; } 
    public string Responsetype { get; set; } 
    public string ItemResponseDescription { get; set; } 
    public string StartText { get; set; } 
    public decimal? SummaryWeight { get; set; } 
} 

Điểm số của nó là 0,94 bởi vì mỗi getter và setter không truy cập 'tất cả các trường hợp khác'.

Nó được tính toán như thế này,

accessAverage - methodCount/1 - methodCount 

(2 - 17)/(1 - 17) = 0.94 (rounded) 

Tôi không hiểu số liệu này, tại sao nó nên bao gồm getter và setter? Một getter và setter sẽ luôn luôn chỉ truy cập vào một trường duy nhất.

+1

Tôi cho rằng chỉ số LCOM nên xem xét các thuộc tính tự động giống với các trường. – Gabe

+3

Điều về số liệu giống như LCOM là, điều 'Đánh giá', đó không thực sự là một lớp. Nó chỉ là một POCO câm ('câm 'có một ý nghĩa cụ thể, không xúc phạm), một cấu trúc (hoặc ghi lại trong cách nói giống như Pascal.) Nó không có hành vi (hành vi thường được biểu diễn bởi các mối quan hệ nhà nước giữa các phương thức.) Ergo, nó là không phải là một lớp ** thực **. Nó có thể là từ một ngôn ngữ POV, nhưng không phải từ một POV tên miền (đó là những gì bạn thực sự quan tâm.) Tôi hoặc tránh thu thập số liệu LCOM trong POJOS hoặc cấu trúc, hoặc bỏ qua các kết quả cho họ. LCOM là đúng - nó không phải là một lớp học. Chỉ cần sử dụng thông tin đó cho phù hợp. –

+1

Có thể vì getters và setters thực sự làm giảm sự gắn kết của lớp và phải tránh trong lập trình hướng đối tượng: http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil. html – yegor256

Trả lời

26

Điều này chứng tỏ rằng mọi chỉ số phần mềm đều thiếu sót nếu bạn mù quáng đưa nó đến mức cực đoan.

Bạn biết một lớp "không hoạt động" khi bạn thấy một lớp học. Ví dụ:

class HedgeHog_And_AfricanCountry 
{ 

    private HedgeHog _hedgeHog; 
    private Nation _africanNation; 

    public ulong NumberOfQuills { get { return _hedgeHog.NumberOfQuills; } } 
    public int CountOfAntsEatenToday { get { return _hedgeHog.AntsEatenToday.Count(); } } 

    public decimal GrossDomesticProduct { get { return _africanNation.GDP; } } 
    public ulong Population { get { return _africanNation.Population; } } 
} 

Đây rõ ràng là một lớp không quan trọng, vì nó chứa hai phần dữ liệu không cần phải kết nối với nhau.

Nhưng mặc dù điều hiển nhiên đối với chúng tôi rằng lớp học này là không quan trọng, làm thế nào bạn có thể nhận được một chương trình phần mềm để xác định tình trạng loạn luân? Làm thế nào nó sẽ nói rằng các lớp trên là incohesive, nhưng điều này không?

class Customer 
{ 
    public string FullName { get; set; } 
    public Address PostalAddress { get; set; } 
} 

Số liệu mà chúng đã tìm ra chắc chắn phát hiện tình trạng xâm phạm, nhưng cũng có kết quả dương tính giả.

Điều gì sẽ xảy ra nếu bạn quyết định số liệu này là quan trọng? Bạn có thể tạo lớp "CustomerData" chỉ chứa các trường và lớp "Khách hàng" hiển thị trường dữ liệu dưới dạng thuộc tính.

// This has no methods or getters, so gets a good cohesion value. 
class CustomerData 
{ 
    public string FullName; 
    public Address PostalAddress; 
} 

// All of the getters and methods are on the same object 
class Customer 
{ 
    private CustomerData _customerData; 
    public string FullName { get { return _customerData.FullName; } } 
    // etc 
} 

Nhưng nếu tôi đang chơi trò chơi này, tôi có thể áp dụng nó vào ví dụ incohesive cũng như:

class Hedgehog_And_AfricanCountry_Data 
{ 
    public Hedgehog _hedgehog; 
    public AfricanNation _africanNation; 
} 

class Hedgehog_And_AfricanCountry 
{ 
    private Hedgehog_And_AfricanCountry_Data _hedgehogAndAfricanCountryData; 
    // etc; 
} 

Thực sự, tôi nghĩ rằng nó là tốt nhất để hiểu những gì gắn kết là gì, và tại sao nó là một mục tiêu đáng giá, nhưng cũng hiểu rằng một công cụ phần mềm có thể không đo lường nó một cách đúng đắn.

+1

Điểm rất thú vị. Cảm ơn. – peter

+0

Chỉ cần suy nghĩ về nó nhiều hơn một chút mặc dù, sẽ không một getter và setter chỉ bao giờ được truy cập vào một lĩnh vực mỗi anyway? Hoặc là giá trị của số liệu được cho là được đưa xuống các lớp nơi có nhiều phương pháp? – peter

+1

Tôi đoán những gì tôi đang cố gắng để nói là chúng ta không nên loại bỏ các getters và setters? Điều đó sẽ không cho kết quả chính xác hơn? – peter

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