Шаблон делегирования;Как поделиться контекстной информацией? - PullRequest
0 голосов
/ 02 ноября 2019

Я немного озадачен хорошими и плохими практиками, касающимися схемы проектирования делегирования. Может быть, вся моя концепция пошла в неправильном направлении. Поэтому мне нужен совет и наставничество!

Я написал пример кода с простой настройкой, который показывает мою проблему. Существует тип делегирования ITask, который я бы хотел максимально отделить от ITaskDistributor. Но, в конце концов, я увидел, что возникла необходимость в более тесном связывании. Я очень переживаю из-за этого и не уверен, что делать.

// Generic ParameterSet as interface for all objects involved in working with the tasks
public interface ITaskDistributor{
 IParameterSet Parameters{ get; }
}

// Executeing some specific code in reading/writing the ParameterSets of processor and distributor
public interface ITask{
 void Execute( IDataSet dataset, ITaskDistributor distributor );
}

public interface IDataSet : TaskDistributor{
 //... specific members and methods - mostly variables
}

public class TaskDistributorAlpha : ITaskDistributor{
 //...
 private List<IDataSet> datasets = new List<IDataSet>();
 void Run( ITask task ){
  foreach( var ds in datasets )
   task.Execute( ds, this ); //do some stuff with DataSet and own ParameterSet
 }
}


public class TaskRegular : ITask{
 public void Execute( IDataSet dataset, ITaskDistributor distributor ){
   //everything fine
 }
}

public class TaskSpecial : ITask{
 public void Execute( IDataSet dataset, ITaskDistributor distributor ){
  //want to access BetaOnlyParameters which is specific to TaskDistributorBeta and not to 
 }
}

public class TaskDistributorBeta : ITaskDistributor{
 //... similar to Alpha 
 IParameterSet BetaOnlyParamters{ get; }
}




public void main(){
 var alpha = new TaskDistributorAlpha();
 alpha.Run( new TaskRegular() ); //everything fine

 var beta = new TaskDistributorBeta();
 beta.Run( new TaskRegular() ); //still everything fine

 var dataset = new DataSetImplementationNotShownHere();
 dataset.RunATask( new TaskRegular() ); //works fine because IDataSet is also interfaced - nice to have but not absolutely necessary.

 beta.Run( new TaskSpecial() ); //i want it to be more coupled but i feel bad about it and dont know what to do with that

}

Как я могу добиться, чтобы TaskSpecial знал достаточно о том, кто его выполняет, что он все еще работает, но настолько отделен, насколько это возможно. Хотя мой код написан на c #, моё возможное неправильное понимание шаблона проектирования не зависит от языка.

...