该代码最初暴露了各种ActiveRecord样式业务对象的集合(数组) – 实质上是包装数据库字段的对象.我正在将数组更改为通用列表,但我很好奇的代码方面是前一个开发人员为他正在包装的每种类型的对象都有Get方法,因此:
public Thing GetThing(int i) { return things[i]; }
有几种这样的方法,我不能为我的生活想到使用该机制而不是直接简单地引用事物[i]的任何可能的优势.为了论证,我们假设事物是公共财产,而不是公共领域(在这种情况下,它实际上是一个自动实现的属性,因此假设实际上是正确的).
我错过了一些明显的东西吗甚至是一些深奥的东西?
UPDATE
我应该澄清一下,这些集合目前是从for循环中访问的:
for (int i = 0; i < thingsCount; i== ) { dosomthing( GetThing(i) ); dosomethingelse( GetThing(i) ); }
我正在重构:
for (int i = 0; i < thingsCount; i== ) { Thing thing = things[i]; dosomthing( thing ); dosomethingelse( thing ); }
甚至可以使用things.foreach().
解决方法
假设事情是IList< Thing>.然后直接暴露它(作为Things)将允许调用代码来调用Add,Insert,RemoveAt等.也许以前的开发人员不想允许这个(并且我确信有很多充分的理由).
即使假设它是一个Thing [](因此Add等等也不可用),因此暴露它仍然允许调用代码来执行类似obj.Things [0] = new Thing();这可能是一个不应该允许的操作,具体取决于类的实现.
您可以将Things公开为ReadOnlyCollection< Thing>这将解决大多数这些问题.但它归结为:如果开发人员只想允许调用代码按索引访问项目 – 仅此而已 – 然后提供一个GetThing方法作为这样做的手段,老实说,这是迄今为止最有意义的.
现在,授予,还有这个选项:只使用get访问器实现this [int]属性.但是,只有当所讨论的类本质上是Thing对象的集合时才有意义(即,也不存在要在类中提供访问权的其他类型对象的集合).
总而言之,我认为GetThing方法非常合理.
也就是说,从您提出问题的方式来看,这听起来像以前的开发人员做出了一些其他非常糟糕的决定:
>如果他/她也直接将收集品作为公共财产暴露出来,那么……那就违背了GetThing方法的全部目的,不是吗?结果只是一个膨胀的界面(我通常认为,当你有多种方法完成同样的事情时,它不是一个好兆头,除非出于某种正当理由将它们清楚地记录为别名). [更新:以前的开发人员似乎没有这样做.好.]>看起来之前的开发人员也在使用GetThing方法从内部访问项目,这很愚蠢(在我看来).为什么在类本身内使用类的公共接口引入额外方法调用的无意义开销?如果你在课堂上,你已经在实现中,并且可以访问所有你想要的私人/受保护数据 – 不需要假装.