Vì vậy, tôi đã vào một cuộc tranh luận thân thiện với đồng nghiệp qua một đoạn mã:Tôi có nên sử dụng một lĩnh vực hoặc tài sản trong lớp để thiết lập giá trị
public sealed class NewObject
{
private string _stuff = string.Empty;
public string Stuff
{
get { return GetAllStuff(); }
}
private string GetAllStuff()
{
//Heavy string manipulation of _stuff
}
public NewObject(string stuffToStartWith)
{
_stuff = stuffToStartWith;
}
public static NewObject operator +(NewObject obj1, NewObject obj2)
{
if (obj1 == null)
throw new ArgumentNullException();
if (obj2 == null)
throw new ArgumentNullException();
NewObject result = new NewObject(string.Empty);
result._stuff = String.Concat(obj1._stuff, obj2._stuff);
return result;
}
}
Đối số đã kết thúc ghi đè điều hành. Đồng nghiệp của tôi cảm thấy rằng đó không phải là thực hành lập trình tốt nhất để đặt giá trị của các trường riêng tư ở bất kỳ đâu ngoài hàm tạo. Giải pháp do đồng nghiệp của tôi đề xuất là cấu trúc lại tên của thuộc tính Stuff
thành AllStuff
và thêm thuộc tính, Stuff
, có truy cập get
AND set
và sử dụng thuộc tính Stuff
mới trong ghi đè toán tử. Làm như sau:
public static NewObject operator +(NewObject obj1, NewObject obj2)
{
if (obj1 == null)
throw new ArgumentNullException();
if (obj2 == null)
throw new ArgumentNullException();
NewObject result = new NewObject(string.Empty);
result.Stuff = String.Concat(obj1.Stuff, obj2.Stuff);
return result;
}
Tôi không đồng ý. Tôi cảm thấy cách đầu tiên tốt hơn vì nó giữ tài sản chỉ đọc bên ngoài lớp học. Câu hỏi của tôi là, cách nào là cách thực hành tốt nhất cho thiết kế hướng đối tượng?
@cyber: Tôi nghĩ đây là vấn đề của OP không hoàn toàn rõ ràng. Nó nghe giống tôi như đồng nghiệp của anh ta đã ủng hộ việc không thay đổi một biến riêng tư trực tiếp bên ngoài của nhà xây dựng hoặc việc thực hiện tài sản. Tôi không nghĩ anh ta đang ủng hộ việc giữ các giá trị như nhau cho cuộc đời của vật thể. –