gpt4 book ai didi

language-agnostic - DRY 没有单个代码?

转载 作者:行者123 更新时间:2023-12-04 18:28:03 24 4
gpt4 key购买 nike

我不想重复自己(DRY),但我不能有一段代码。例如,这里的代码重复了 3 次,但存在相同的错误:

class StarWars : Movie
{
//Calculate "base ^ exponent"
public float Power(float base, float exponent)
{
return (base * exponent);
}
}

class Customer: Object
{
//Calculate "base ^ exponent"
public float Exponential(float base, float exponent)
{
return (base ^ exponent);
}
}

class Student: Person
{
//Calculate "base ^ exponent"
public float CalculateExpoential(float base, float exponent)
{
return CalculateExponential(2.7182818, exponent * Ln(base));
}
}

现在理想情况下,我会在某处将这个通用函数提取到它自己的助手中:
class LibraryOfHelperCode
{
public static float Exponentiation(float base, float exponent)
{
return Exp(2.71828183, base * Ln(exponent));
}
}

并转换现有代码以使用它:
class StarWars : Movie
{
//Calculate "base ^ exponent"
public float Power(float base, float exponent)
{
return LibraryOfHelperCode.Exponentiation(base, exponent);
}
}

class Customer: Object
{
//Calculate "base ^ exponent"
public float Exponential(float base, float exponent)
{
return LibraryOfHelperCode.Exponentiation(base, exponent);
}
}

class Student: Person
{
//Calculate "base ^ exponent"
public float CalculateExpoential(float base, float exponent)
{
return LibraryOfHelperCode.Exponentiation(base, exponent);
}
}

值(value)是现在我已经从
  • 电源
  • 指数
  • 计算指数

  • 成一个单一的功能。这意味着如果有任何错误,它们只需修复一次。在这种情况下哪个好,因为有 一个错误:
       public float CalculateExpoential(float base, float exponent)
    {
    //19971012: Oops, should be natrual log of base, not exponent
    return Exp(2.71828183, exponent * Ln(base));
    }

    几年后:
       public float CalculateExpoential(float base, float exponent)
    {
    //19990321: Oops, need to handle when exponent is zero
    if (exponent == 0)
    return 1.0;

    //19971012: Oops, should be natrual log of base, not exponent
    return Exp(2.71828183, exponent * Ln(base));
    }

    后来:
       public float CalculateExpoential(float base, float exponent)
    {
    //19990321: Oops, need to handle when exponent is zero
    if (exponent == 0)
    return 1.0;

    //20040523: Another special case
    if (Base = 0.0) && (Exponent > 0.0) then
    return 0.0; // 0**n = 0, n > 0

    //19971012: Oops, should be natrual log of base, not exponent
    return Exp(2.71828183, exponent * Ln(base));
    }

    最后:
       public float CalculateExpoential(float base, float exponent)
    {
    //20101027: Microsoft just release a method in .NET framework 4.0 that does
    //what we need. Use it:
    return Math.Pow(base, exponent);
    }

    每个人都得到修复。另一方面,我不能保证这些增量修复中的任何一个都不会破坏现有代码。

    想象一个人在打电话:
    char ps = Math.Trunc(Exponential(ProblemSize, ProblemComplexity));

    并且从没想过这个值会大于 128。他错了。虽然代码是 错了一直以来:它 发生了去工作。

    现在我来解决问题,突然代码由于溢出和/或环绕而崩溃。

    我今天面临的问题是 DRY 通用代码的更改会影响它使用的所有地方。唯一可接受的(政治)解决方案是为每个使用它的可执行文件/模块/命名空间/类保留库类的副本。

    消除任何干燥。

    有没有办法摆脱这种困惑?当我不能重复自己,而是在将它们添加到单个 DRY 代码时继续获得修复和改进时?

    我的意思是...我应该共享代码,但在每个版本中都对其进行分支吗?但问题是政治上没有人希望代码都被反向集成。

    最佳答案

    只有更改库的界面时,您的程序才会中断。如果更改库的实现会破坏您的程序,那么您可能将程序与库绑定(bind)得太强了。该程序不应该依赖于图书馆的内部运作。
    如果您不断更改库的界面并破坏您的项目,您可能需要花更多的时间来设计您的库。

    您还应该为您的库使用版本控制。针对库的特定分支/版本构建代码。如果库接口(interface)发生重大变化并且您不想更新现有项目,请为新接口(interface)创建一个新分支,新项目可以使用,而旧项目可以继续使用旧分支。可以针对一个分支编写错误修复并合并到另一个分支。

    Git 尤其擅长这种事情。使用子模块将您的项目链接到库的特定提交。

    关于language-agnostic - DRY 没有单个代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4034690/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com