需要帮助决定如何构建一个c#应用程序来创建既相似又不同的产品
本文关键字:创建 相似 应用程序 一个 决定 帮助 何构建 构建 | 更新日期: 2023-09-27 18:17:50
我在试图找出这个程序的最佳架构时遇到了一点心理障碍,需要一些帮助。
我正在写一个c#应用程序来创建我们称之为"视图"的东西。视图基本上是一个对象,它接受一些数据作为输入,并输出另一个对象作为输出。
这是我设想的代码:
ViewResponse response;
ViewRequest request;
request = new CustomerViewRequest();
request.Translations = GetTranslations(); // generic to Request
request.CustomerViewAsOfDate = new DateTime(2014,1,1); // specific to CustomerViewRequest
response = ViewCreator.CreateView(request);
Console.WriteLine(response.ViewCreatedSuccessfully); // generic to Response
Console.WriteLine((CustomerViewResponse)response.SomeCustomerViewSpecificProperty); // specific to CustomerViewResponse
request = new BKLedgerViewRequest();
request.Translations = GetTranslations(); // generic to Request
request.EAAnalysisData = GetEAAnalysisData(); // specific to BKLedgerViewRequest
response = ViewCreator.CreateView(bkRequest);
Console.WriteLine(response.ViewCreatedSuccessfully); // generic to Response
Console.WriteLine((BKLedgerViewResponse)response.SomeBKLedgerViewSpecificProperty); // specific to BKLedgerViewResponse
你不应该需要帮助决定一个设计模式
原因是,设计模式不是千篇一律的,也不是一种模式适合所有人。应该实现一个模式来解决特定的问题。它不应该用作原始架构,而应该用于帮助解决特定问题。
一旦你引入了一个模式,它就会引入它自己的复杂性和局限性。这可能会阻碍你的目标。
真正的问题应该是,我如何重构这个应用程序以优化性能,捕获应用程序目标,并保持可读性/可维护性?根据所提供的信息,我们甚至无法推荐模式,因为我们不知道您的应用程序的目标、问题和限制。这就是为什么当您从业务、用户和开发人员的角度理解您的应用程序时,通常由创建者来找到最佳解决方案的原因。
当我看你的代码时,似乎完成你想要的关键是理解面向对象编码、继承、协方差和逆变。我做了一个重构你的代码下面编译,一般做你正在寻找基于使用一个基类ViewRequest和ViewResponse。
当你实例化对象时,使用更具体的类型CustomerViewRequest(例如)给你一个对象,你可以视其为ViewRequest或CustomerViewRequest,这取决于你的需要。
class Class6
{
public object GetTranslations() { return null; }
public object GetEAAnalysisData() { return null; }
public void DoStuff()
{
CustomerViewRequest cvRequest = new CustomerViewRequest();
cvRequest.Translations = GetTranslations(); // generic to Request
cvRequest.CustomerViewAsOfDate = new DateTime(2014, 1, 1); // specific to CustomerViewRequest
CustomerViewResponse cvResponse = ViewCreator.CreateViewResponse<CustomerViewResponse>(cvRequest);
Console.WriteLine(cvResponse.ViewResponseCreatedSuccessfully); // generic to Response
Console.WriteLine(cvResponse.SomeCustomerViewSpecificProperty); // specific to CustomerViewResponse
BKLedgerViewRequest bkRequest = new BKLedgerViewRequest();
bkRequest.Translations = GetTranslations(); // generic to Request
bkRequest.EAAnalysisData = GetEAAnalysisData(); // specific to BKLedgerViewRequest
BKLedgerViewResponse bkResponse = ViewCreator.CreateViewResponse<BKLedgerViewResponse>(bkRequest);
Console.WriteLine(bkResponse.ViewResponseCreatedSuccessfully); // generic to Response
Console.WriteLine(bkResponse.SomeBKLedgerViewSpecificProperty); // specific to BKLedgerViewResponse
}
}
class ViewRequest
{
public object Translations { get; set; }
}
class ViewResponse
{
public bool ViewResponseCreatedSuccessfully { get; set; }
}
class CustomerViewRequest : ViewRequest
{
public DateTime CustomerViewAsOfDate { get; set; }
}
class CustomerViewResponse : ViewResponse
{
public string SomeCustomerViewSpecificProperty { get; set; }
}
static class ViewCreator
{
public static T CreateViewResponse<T>(ViewRequest request)
where T : ViewResponse, new()
{
return new T();
}
}
class BKLedgerViewResponse : ViewResponse
{
public int SomeBKLedgerViewSpecificProperty { get; set; }
}
class BKLedgerViewRequest : ViewRequest
{
public object EAAnalysisData { get; set; }
}