Hãy xem xét các lớp saucó nên phương pháp lớp chấp nhận các tham số hoặc thuộc tính của lớp sử dụng
public class Class1
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult()
{
return A + B;
}
}
Để sử dụng GetComplexResult
, một người tiêu dùng của lớp này sẽ phải biết để thiết lập A
và B
trước khi gọi phương pháp này. Nếu GetComplexResult
truy cập nhiều thuộc tính để tính kết quả của nó, điều này có thể dẫn đến các giá trị trả về sai nếu người tiêu dùng không đặt tất cả các thuộc tính thích hợp trước tiên. Vì vậy, bạn có thể viết lớp này như thế này thay vì
public class Class2
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult(int a, int b)
{
return a + b;
}
}
Bằng cách này, một người gọi đến GetComplexResult
buộc phải vượt qua trong tất cả các giá trị cần thiết, đảm bảo giá trị lợi nhuận kỳ vọng được tính một cách chính xác. Nhưng nếu có nhiều giá trị cần thiết, danh sách tham số sẽ tăng lên và điều này dường như không có thiết kế tốt. Nó cũng có vẻ phá vỡ các điểm đóng gói A
, B
và GetComplexResult
trong một lớp duy nhất. Tôi thậm chí có thể bị cám dỗ để làm cho GetComplexResult
tĩnh vì nó không yêu cầu một cá thể của lớp để thực hiện công việc của nó. Tôi không muốn đi xung quanh thực hiện một loạt các phương pháp tĩnh.
Có các thuật ngữ để mô tả 2 cách tạo lớp khác nhau này không? Cả hai dường như có ưu và khuyết điểm - có điều gì đó tôi không hiểu nên nói với tôi rằng một cách nào đó tốt hơn cách khác? Thử nghiệm đơn vị ảnh hưởng đến lựa chọn này như thế nào?
Tôi luôn cố gắng gọi getters thay vì truy cập trực tiếp các thành viên, và trong getter tôi đăng nhập một thông báo nếu tôi trả về giá trị null. Tôi đã từng sử dụng các xác nhận, nhưng sau đó chúng tôi phát hiện ra rằng một số khách hàng của chúng tôi chạy với các xác nhận được bật trong sản xuất (!). – TMN