需要帮助决定如何构建一个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

需要帮助决定如何构建一个c#应用程序来创建既相似又不同的产品

你不应该需要帮助决定一个设计模式

原因是,设计模式不是千篇一律的,也不是一种模式适合所有人。应该实现一个模式来解决特定的问题。它不应该用作原始架构,而应该用于帮助解决特定问题。

一旦你引入了一个模式,它就会引入它自己的复杂性和局限性。这可能会阻碍你的目标。

真正的问题应该是,我如何重构这个应用程序以优化性能,捕获应用程序目标,并保持可读性/可维护性?

根据所提供的信息,我们甚至无法推荐模式,因为我们不知道您的应用程序的目标、问题和限制。这就是为什么当您从业务、用户和开发人员的角度理解您的应用程序时,通常由创建者来找到最佳解决方案的原因。

当我看你的代码时,似乎完成你想要的关键是理解面向对象编码、继承、协方差和逆变。我做了一个重构你的代码下面编译,一般做你正在寻找基于使用一个基类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; }
}