是否需要按特定顺序执行的方法是私有的?

eto*_*bot 26 c#

我有一个类检索一些数据,图像对它们做了一些东西,然后使用Web服务将它们上传到第三方应用程序.该对象需要按顺序执行某些特定步骤.我的问题是我是否应该像这样公开公开每种方法.

myObject obj = new myObject();
obj.RetrieveImages();
obj.RetrieveAssociatedData();
obj.LogIntoThirdPartyWebService();
obj.UploadStuffToWebService();
Run Code Online (Sandbox Code Playgroud)

或者所有这些方法都应该是私有的,并且封装在一个像这样的公共方法中.

public class myObject()
{
 private void RetrieveImages(){};
 private void RetrieveAssociatedData(){};
 private void LogIntoThirdPartyWebService(){};
 private void UploadStuffToWebService(){};

 public void DoStuff()
  {
   this.RetrieveImages();
   this.RetrieveAssociatedData();
   this.LogIntoThirdPartyWebService();
   this.UploadStuffToWebService();
  }
}
Run Code Online (Sandbox Code Playgroud)

这就是这样称呼的.

myObject obj = new myObject();
obj.DoStuff();
Run Code Online (Sandbox Code Playgroud)

Joh*_*lla 25

这取决于谁知道应该以这种方式调用这些方法.

  • 消费者知道:例如,如果对象是一个Stream,通常是消费者的流的决定何时Open,Read以及Close流.显然,这些方法需要公开,否则对象无法正常使用.(*)

  • 对象知道:如果对象知道的方法的顺序(例如,它是一个TaxForm和必须作出特定的顺序计算),那么这些方法应该是私有的,并通过一个单一的更高级别的一步暴露(如ComputeFederalTax将调用CalculateDeductions,AdjustGrossIncomeDeductStateIncome) .

  • 如果步数超过少数,您将需要考虑Strategy而不是将步骤直接耦合到对象中.然后你可以改变周围的东西,而不会过多地使用对象或其界面.

在您的特定情况下,您的对象的使用者似乎不关心除正在进行的处理操作之外的任何事情.因为它不需要知道这些步骤发生的顺序,所以应该只有一个公共方法被调用Process(或者那种效果).


(*)但是,通常对象至少知道可以调用方法以防止无效状态的顺序,即使它不知道何时实际执行这些步骤.也就是说,对象应该足够了解以防止自己陷入无意义的状态; 如果你Close之前尝试调用某种异常Open就是一个很好的例子.


Rex*_*x M 14

如果除非首先调用A(),否则方法B()确实无法调用,那么正确的设计要求A应该返回B需要的一些对象作为参数.

这是否总是实用是另一回事,但这就是它应该如何完成的.