假设我有以下内容
Class A {
Foo getFoo();
Bar getBar();
Baz getBaz();
}
Run Code Online (Sandbox Code Playgroud)
我需要定义一个函数doStuff
使用Foo
,Bar
,Baz
的一个对象,并做一些事情
我正在努力实现哪种方法doStuff
更好(假设它不适合放在doStuff
类中A
)
方法A.
void doStuff(Foo foo, Bar bar, Baz baz)
{
//some operation
}
Run Code Online (Sandbox Code Playgroud)
要么
方法B.
void doStuff(A a)
{
Foo foo = a.getFoo();
Bar bar = a.getBar();
Baz baz = a.getBaz();
//some operation
}
Run Code Online (Sandbox Code Playgroud)
据我所知,(+专业, - 缺点)
方法A.
+很清楚究竟有哪些参数可以doStuff()
运行
- 易受长参数列表的影响,更容易受到用户错误的影响
方法B.
+简单易用的方法
+似乎更具可扩展性(?)
- 对课堂不必要的依赖 A
任何人都可以分享对这两种方法的利弊的额外见解吗?
我正在尝试构建一个框架,允许人们通过实现接口来扩展我们的核心功能.下面是这个界面的一个愚蠢的例子.
public interface MyInterface
{
IData GetData(string p1, char p2, double p3);
}
Run Code Online (Sandbox Code Playgroud)
最近,我们决定修改这个界面(我知道我不应该破坏依赖代码,但事实是我们还没有任何第三方实现这个界面,所以我们有机会进行"重做"正确实现此接口).
我们需要在此界面中再添加2个参数,以使我们的软件正常工作.我们想到的两种方法就是将它们添加到签名中,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, bool p4, DateTime p5);
}
Run Code Online (Sandbox Code Playgroud)
或者通过创建这样的参数对象
public class MyParameters
{
public bool p4 { get; set; }
public DateTime p5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并将它们添加到方法的末尾,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, MyParameters p4);
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找某种指导,以哪种方式是"最"正确的方法.我可以在两个类别中看到利弊,但我不希望我的偏见让我走错了路.
我的一些主要担忧是:
我甚至不知道在线询问什么问题来获得这个问题的指导.我有一种感觉,答案是"它取决于"(关于如何将相关的p1-p5与GetData()函数的目的相关联),但有人可以指出我应该要求的一系列问题来帮助我评估一种解决方案是否优于另一种?
相关: 帖子1 …
是否可以选择方法的所有参数并要求ReSharper从这些参数创建一个类作为"方法参数对象?"
下面是一些使用参数类来包含Show()
方法可能参数的代码.这个FooOption
类中的值不是很相关.您可以通过查看Show()
下面的实现来看到这一点.我知道这是错误的代码,但有没有与此相关的反模式?
class FooOptions {
public int? Id { get; set; }
public string BazContext { get; set; }
public int? BazId { get; set; }
}
class BarMgr {
public Bar Show(FooOptions options) {
if (options == null)
options = new FooOptions();
if (options.Id.HasValue)
return svc.GetBar(options.Id.Value);
if (!string.IsNullOrEmpty(options.BazContext) && options.BazId.HasValue)
return svc.GetBar(options.BazContext, options.BazId.Value);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
更新:我知道参数对象不是反模式.根据我的经验,参数对象属性是相关的.这是我试图找到的可能的反模式.设置所有三个属性是没有意义的.
我有一些代码是相同的,除了一定的分配顺序发生在略有不同的顺序.
很容易将其分解为类型的方法参数int[]
,它表示顺序.
但是,我发现它并不是最清楚的.
另一种选择是将它们分解为类型的对象AssignmentOrders
.我也可以对对象构造函数中的值进行验证,而这些值是我无法对数组进行的.这将是从书,"引入参数对象"重构重构.
我想知道这种特殊的重构是否过度,我应该坚持下去int[]
?
码:
原件的三个样本:
private static PersonDetails parseLine(String line, String deliminator, int[] orderOfSections)
throws Exception {
String[] sections = line.split(deliminator);
String value1 = sections[0].trim();
String value2 = sections[1].trim();
String value3 = sections[4].trim();
String value4 = sections[2].trim();
String value5 = sections[3].trim();
//........
}
private static PersonDetails parseLine(String line, String deliminator)
throws Exception {
String[] sections = line.split(deliminator);
String value1 = sections[1].trim();
String value2 = sections[0].trim();
String value3 = sections[2].trim();
String …
Run Code Online (Sandbox Code Playgroud)