是否更好地进行代码重复并使其非常简单/可读,或者没有重复(使用泛型)但更复杂?

dar*_*ckc 8 java generics code-duplication

总的来说,我经常遇到这个问题.我的一些同事喜欢非常简单易读的类,即使这意味着存在一些代码重复,而我尽我所能避免代码重复,即使它意味着制作更复杂的架构.什么是最佳做法?我专门用Java工作.

rtp*_*son 14

我总是喜欢这个解决方案而没有重复的代码.即使更复杂的架构最初难以理解,维护的好处也超过了学习曲线.

  • 并且程序员可以创建干净的代码,这样即使是复杂的架构也很容易理解.我的观点:你的同事很懒:-P (3认同)

Ree*_*sey 9

虽然两者都是很好的目标,但我觉得可读性是拥有可维护代码库的绝对首要要求.我总是更喜欢简单,可读和可维护,以完全消除代码重复.

  • 我同意.这里的问题是为什么非重复代码难以阅读/维护? (6认同)

Jul*_*iet 6

最佳实践:如果代码很短,请将其复制两次,但不要更多.

因此,如果您在3个不同的地方复制/粘贴非常相似的代码片段,请考虑重构.

请记住,重构不会自动意味着使代码更复杂.考虑以下:

class IntStack
{
    public int value;
    public IntStack next;
}

class StringStack
{
    public String value;
    public StringStack next;
}

class PersonStack
{
    public Person value;
    pubilc PersonStack Next;
}
Run Code Online (Sandbox Code Playgroud)

每当您想要一个新数据类型的堆栈时,您需要编写一个新类.复制代码工作正常,但是假设你想添加一个新方法,也许是一个返回新堆栈的"Push"方法?好吧,现在你被迫将它添加到不同的地方.或者你可以使用通用的Object堆栈,但是你会失去类型安全性.泛型将简化架构:

class Stack<T>
{
    public T value;
    public Stack<T> next;
}
Run Code Online (Sandbox Code Playgroud)

凉!

好吧,这个例子怎么样:

class Logger
{
    int logtype;
    public Logger(int logtype) { ... }

    public void Log(string text)
    {
        if (logtype == FILE) { ... }
        elseif (logtype == DATABASE) { ... }
        elseif (logtype == CONSOLE) { ... }
    }

    public void Clear()
    {
        if (logtype == FILE) { ... }
        elseif (logtype == DATABASE) { ... }
        elseif (logtype == CONSOLE) { ... }
    }

    public void Truncate(int messagesToTruncate)
    {
        if (logtype == FILE) { ... }
        elseif (logtype == DATABASE) { ... }
        elseif (logtype == CONSOLE) { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,所以每次添加方法时,都必须检查你正在使用哪种记录器.痛苦,容易出错.通常,您会将接口(可能使用Log,Clear和Truncate方法)分解出来,然后创建三个类(FileLogger,DatabaseLogger,ConsoleLogger).

更多类=更多架构.从长远来看,这是更容易还是更难维护?对于这个例子,我会说代码现在更容易维护,但是YMMV.


Thi*_*Not 5

避免代码重复的主要原因是可维护性。如果一段代码出现在多个地方,那么当需要更新时你必须记住到处都改变它。忘记更改一个实例可能会导致问题,您可能不会立即注意到。