c# - 如何维护一些基本相同但基于相同代码库的软件产品?

标签 c# oop architecture

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

7年前关闭。




Improve this question




请耐心等待,让我解释一下。假设我为 工作车辆保险公司我们正在努力开发一个在线门户,我们的客户可以购买保险单 .假设我们提供 3 种保险产品汽车保险 (CI)、摩托车保险 (MI) 和卡车保险 (TI)。我要说的是,这些产品中的 90% 在我们如何实现它们方面是相似的,但在剩下的 10% 中它们却有很大不同。

让我以C#为例来演示(下面的代码是一个粗略的想法来演示我的问题不是真正的代码)。

public class CarInsurancePolicy
{
    //common properties among all 3 insurance products
    public decimal MadeYear {get;set}
    public decimal PurcahsePrice {get;set}

    //specific to this particular product
    public bool HasCentralLocking {get;set}
    public DateTime SpecialDateToDoWithCar {get;set}
}

public class MotorcycleInsurancePolicy
{
    //common properties among all 3 insurance products
    public decimal MadeYear {get;set}
    public decimal PurcahsePrice {get;set}

    //specific to this particular product
    public int EngineStroke {get;set}
    public DateTime SpecialDateToDoWithMotorcycle {get;set}
}

public class TruckInsurancePolicy
{
    //common properties among all 3 insurance products
    public decimal MadeYear {get;set}
    public decimal PurcahsePrice {get;set}

    //specific to this particular product
    public decimal LoadCapacityInTons {get;set}
    public DateTime SpecialDateToDoWithTruck {get;set}
}

正如您所看到的,对于每个策略类,它们的属性大多相同,但与每种类型有很大不同。现在来到数据库部分。

我不知道我是否应该这样做
CREATE TABLE BaseInsurancePolicy
(
  //all common columns
)

CREATE TABLE CarInsurancePolicy
(
  //specific to this type of product
)

CREATE TABLE MotorcycleInsurancePolicy
(
  //specific to this type of product
)

CREATE TABLE TruckInsurancePolicy
(
  //specific to this type of product
)

或者我应该这样做
CREATE TABLE GiantInsurancePolicyTable
(
  //all columns and everything is NULLABLE
)

现在来到工作流程部分

我们有一些基本的常用步骤来评价任何类型的产品。假设我们考虑到制造年份,KM 旅行等形成一个基本评级,然后根据特定的产品类型,我们有特殊的方法来计算溢价。
public class RatingEngingForCar
{
   //can be common step
   public decimal GetPremium() {}

   //specific for car
   private void ApplyA() {}
   private void ApplyC() {}
}

public class RatingEngingForMotorcycle
{
   //can be common step
   public decimal GetPremium() {}

   //specific for motorcycle
   private void ApplyE() {}
   private void ApplyF() {}
}

public class RatingEngingForTruck
{
   //can be common step
   public decimal GetPremium() {}

   //specific for motorcycle
   private void ApplyX() {}
   private void ApplyZ() {}
}

然后我们有 90% 相似但 10% 差异很大的工作流程。然后再生成保险单(实际的保单文件)和发票也是一样的。

所以我不知道我是否应该想出某种通用但灵活的方法来形成基类并开始继承和修改每个产品的特定行为。 我应该从第一个产品中复制过去并为第 2、3、4、5 个产品进行修改吗?

在 UI 方面,我正在尝试将我们的 javascript 组件化,以便通常只要 html 结构和 id/name/class 相同,那么将通过包含和启动 JS 自动提供功能。但问题是我需要为每个产品在任何地方复制 HTML。

我不知道我是否已经从非常高的层次上把我的问题解释得足够清楚了。如果不是,我将根据评论更新/澄清。非常感谢你。

最佳答案

在代码方面,这正是面向对象要解决的问题。将通用功能放在基类中,并从中派生出更专业的类。

你可以在数据库中做类似的事情。例如,有一个策略表,其中包含每个常见属性的列和一个 ID。然后,您可以拥有包含其他字段的专家表(例如,一个汽车保险表),其中的一列是基表的外键引用。

您可以轻松地向数据库添加一个 View ,将所有这些都呈现为一张巨大的表格,因此您可以通过很好地构建它并没有丢失任何东西。

关于c# - 如何维护一些基本相同但基于相同代码库的软件产品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893470/

相关文章:

c# - 将实体添加到 Stanford NLP NER 分类器

c# - 将 SqlCommand 的 CommandTimeout 设置为高值是否有任何负面影响?

PHP:如何检查两个类的所有公共(public)方法是否返回相同的值?

model-view-controller - 可以从 dotnet core 1 访问嵌套引用

sql - 数据访问层是否应该包含业务逻辑?

c# - 我有一个 8bpp 1024 X 1024 大小的 PGM 格式图像,需要从中计算 GLCM(灰度共生矩阵)

c# - 通用运行时?

javascript - 更改 [object].prototype 与 [object] 的嵌套函数

php - 如何在不冲突的情况下在另一个 PHP Trait 中使用 PHP Trait?

user-interface - 如何为微服务构建前端