Disclaimer: Tôi rất thích được sử dụng dependency injection về dự án này và có một thiết kế giao diện dựa trên lỏng lẻo trên diện rộng, nhưng việc sử dụng phụ thuộc-tiêm đã bị bắn rơi trong dự án này. Ngoài ra SOLID nguyên tắc thiết kế (và design patterns nói chung) là một cái gì đó nước ngoài, nơi tôi làm việc và tôi mới với nhiều người trong số họ bản thân mình. Vì vậy, hãy xem xét việc xem xét khi đề xuất thiết kế tốt hơn cho vấn đề này.Có tùy chọn thiết kế tốt hơn không?
Đây là phiên bản đơn giản của mã tôi đang làm việc và có vẻ như nó có vẻ bị giả mạo. Nếu vậy tôi xin lỗi. Hãy xem xét các loại sau đây:
// Foo is a class that wraps underlying functionality from another
// assembly to create a simplified API. Think of this as a service layer class,
// a facade-like wrapper. It contains a helper class that is specific to
// foo. Other AbstractFoo implementations have their own helpers.
public class Foo : AbstractFoo
{
private readonly DefaultHelper helper;
public override DefaultHelper Helper { get { return helper; } }
public Foo()
{
helper = new Helper("custom stuff");
}
public override void Operation1(string value)
{
Console.WriteLine("Operation1 using " + value);
}
public override void Operation2()
{
Console.WriteLine("Operation2");
}
}
// Helper derives from a default implementation and allows us to
// override it's methods to do things specific for the class that
// holds this helper. Sometimes we use a custom helper, sometimes
// we use the default one.
public class Helper : DefaultHelper
{
private readonly string customStuff;
public Helper(string value)
{
customStuff = value;
}
public override void DoSomethingHelpful()
{
Console.WriteLine("I was helpful using " + customStuff);
}
}
Giả sử hai lớp được sử dụng như sau:
// foo referenced and used in one part of code
var foo = new Foo();
foo.Operation2(); // or foo.Operation1();
// some other point in the program where we don't have a reference to foo
// but do have a reference to the helper
helper.DoSomethingHelpful();
Tuy nhiên bây giờ tôi nhận ra rằng tôi cũng cần phải thực hiện foo.Operation1
trong một số triển khai của helper.DoSomethingHelpful();
? Các cách giải quyết tiềm năng mà tôi nghĩ đến sẽ là:
- Có foo và người trợ giúp có mối quan hệ hai chiều. Vì vậy mà trong DoSomethingHelpful chúng ta có thể gọi foo.Operation2
- đã foo thực hiện giao diện IHelp và di chuyển "helper" mã vào foo
- Sử dụng đoàn và thông qua phương pháp Operation2 như một đại biểu
Action<string>
vào constructor của Helper.
Không ai trong số những phương pháp dường như là lý tưởng (mặc dù tôi đã khá xác định nhiều tôi không thích tùy chọn 1 và đang lo lắng về khả năng bảo trì với tùy chọn 3 nếu chúng ta tìm hiểu sau đó chúng tôi cần phải vượt qua trong nhiều đại biểu). Điều này khiến tôi tự hỏi liệu có vấn đề với thiết kế ban đầu của combo Helper
/Foo
hay không. Suy nghĩ?
Tôi nghĩ bạn có nghĩa là 'DefaultHelper' thay vì' DefualtHelper'. – ja72
@ ja72, chính tả không bao giờ là bộ đồ mạnh mẽ của tôi, tôi đã cập nhật lỗi đánh máy này. – Matt
+1 cho tuyên bố từ chối trách nhiệm ... Đã có một tiếng cười lớn. – scottheckel