dar*_*ckc 8 java generics code-duplication
总的来说,我经常遇到这个问题.我的一些同事喜欢非常简单易读的类,即使这意味着存在一些代码重复,而我尽我所能避免代码重复,即使它意味着制作更复杂的架构.什么是最佳做法?我专门用Java工作.
rtp*_*son 14
我总是喜欢这个解决方案而没有重复的代码.即使更复杂的架构最初难以理解,维护的好处也超过了学习曲线.
虽然两者都是很好的目标,但我觉得可读性是拥有可维护代码库的绝对首要要求.我总是更喜欢简单,可读和可维护,以完全消除代码重复.
最佳实践:如果代码很短,请将其复制两次,但不要更多.
因此,如果您在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.
归档时间: |
|
查看次数: |
698 次 |
最近记录: |