标签: parameter-object

传递单个对象与传递多个参数

假设我有以下内容

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


任何人都可以分享对这两种方法的利弊的额外见解吗?

parameters design-patterns method-call parameter-object

22
推荐指数
2
解决办法
9573
查看次数

方法参数vs参数对象

我正在尝试构建一个框架,允许人们通过实现接口来扩展我们的核心功能.下面是这个界面的一个愚蠢的例子.

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)

我正在寻找某种指导,以哪种方式是"最"正确的方法.我可以在两个类别中看到利弊,但我不希望我的偏见让我走错了路.

我的一些主要担忧是:

  • 软件的可扩展性 - 我希望用户能够通过实现接口来做我尚未想到的事情
  • 可维护性 - 理想情况下,我希望永远不必再触摸负责再次调用GetData()的代码
  • 清洁API - 我不希望我到达的解决方案让第三方开发人员感到畏缩

我甚至不知道在线询问什么问题来获得这个问题的指导.我有一种感觉,答案是"它取决于"(关于如何将相关的p1-p5与GetData()函数的目的相关联),但有人可以指出我应该要求的一系列问题来帮助我评估一种解决方案是否优于另一种?

相关: 帖子1 …

c# parameter-object

8
推荐指数
1
解决办法
235
查看次数

如何在几秒钟内使用ReSharper创建方法参数对象?

是否可以选择方法的所有参数并要求ReSharper从这些参数创建一个类作为"方法参数对象?"

.net resharper refactoring design-patterns parameter-object

7
推荐指数
1
解决办法
799
查看次数

是否有任何反模式名称来编写这样的代码?

下面是一些使用参数类来包含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)

更新:我知道参数对象不是反模式.根据我的经验,参数对象属性是相关的.这是我试图找到的可能的反模式.设置所有三个属性是没有意义的.

c# design-patterns anti-patterns parameter-object

1
推荐指数
2
解决办法
358
查看次数

帮助重构:介绍参数对象?

我有一些代码是相同的,除了一定的分配顺序发生在略有不同的顺序.

很容易将其分解为类型的方法参数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)

java refactoring parameter-object

0
推荐指数
1
解决办法
1836
查看次数