Tôi sử dụng C #, và đây là những cách tiếp cận của tôi. Xem xét:
class Foo
{
// private fields only to be written inside a constructor
private readonly int i;
private readonly string s;
private readonly Bar b;
// public getter properties
public int I { get { return i; } }
// etc.
}
Tùy chọn 1. Khối mã lệnh với các tham số tùy chọn
public Foo(int i = 0, string s = "bla", Bar b = null)
{
this.i = i;
this.s = s;
this.b = b;
}
Được sử dụng như vd new Foo(5, b: new Bar(whatever))
. Không dành cho các phiên bản Java hoặc C # trước 4.0. nhưng vẫn có giá trị hiển thị, vì nó là một ví dụ cho thấy không phải tất cả các giải pháp đều là ngôn ngữ bất khả tri.
Tùy chọn 2. Hàm tạo lấy một đối tượng tham số duy nhất
public Foo(FooParameters parameters)
{
this.i = parameters.I;
// etc.
}
class FooParameters
{
// public properties with automatically generated private backing fields
public int I { get; set; }
public string S { get; set; }
public Bar B { get; set; }
// All properties are public, so we don't need a full constructor.
// For convenience, you could include some commonly used initialization
// patterns as additional constructors.
public FooParameters() { }
}
Ví dụ sử dụng:
FooParameters fp = new FooParameters();
fp.I = 5;
fp.S = "bla";
fp.B = new Bar();
Foo f = new Foo(fp);`
C # từ 3.0 trở đi làm cho điều này trở nên thanh lịch hơn với cú pháp khởi tạo đối tượng (tương đương về mặt ngữ nghĩa với ví dụ trước):
FooParameters fp = new FooParameters { I = 5, S = "bla", B = new Bar() };
Foo f = new Foo(fp);
Tùy chọn 3:
Thiết kế lại lớp của bạn không cần một số lượng lớn các tham số như vậy. Bạn có thể chia các chức năng của nó thành nhiều lớp. Hoặc truyền các tham số không phải cho hàm tạo mà chỉ cho các phương thức cụ thể, theo yêu cầu. Không phải lúc nào cũng khả thi, nhưng khi có, điều đó rất đáng làm.