перехваты в аргументе функции для размещения будущих данных?

#c# #.net #oop #frameworks

#c# #.net #ооп #фреймворки

Вопрос:

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

Текущий

 Execute(start_time, end_time, DataSet, some_other_data_hook)
  

В настоящее время я реализовал этот перехват в виде словаря, чтобы люди могли помещать имя данных, а затем значения в список

 Dictionary<name_of_the_data,List<value>> some_other_data_hook;
  

Это, конечно, выглядит некрасиво, и я не могу придумать лучшего способа решить эту проблему.

Комментарии:

1. Будут ли все объекты-заменители одного и того же типа?

2. нет, может быть что угодно, но, как @taylonr, упомянутый в ответе ниже, я, вероятно, беспокоюсь о чем-то, что никто никогда не будет использовать. (особенно, если он еще не определен)

Ответ №1:

Я думаю, лучшим подходом было бы спроектировать только то, что вам нужно прямо сейчас. Даже если вы «знаете» и вам обещают эксперты в предметной области и владельцы бизнеса, что появятся новые правила, если их сейчас здесь нет, не пытайтесь устанавливать заполнители.

Частично это связано с аспектом обслуживания, у вас не должно быть никакого кода без ссылок / неиспользуемого кода в вашей сборке. Это вызывает проблемы с ремонтопригодностью, потому что вы не уверены, может ли кто-то его использовать.

Другой аспект — это количество энергии, которое вы собираетесь потратить сейчас, чтобы определить что-то неопределенное. Возможно, одним из будущих перехватов является Duration , поэтому вы планируете это, только для владельцев продукта, чтобы решить, что duration не является хорошей идеей. В конце концов, вы создадите то, что вам может не понадобиться.

Убедитесь, что ваши методы легко модифицируются, что они не приведут к критическим изменениям, а затем настраивайте перехваты только для того, что необходимо сделать сегодня.

Представьте себе, что кто-то собирает компьютер, и вы бы не хотели, чтобы он выбрасывал целую кучу дополнительного припоя на материнскую плату, потому что в будущем может наступить время, когда понадобятся новые устройства. То же самое с кодом, если у вас нет определенной потребности прямо сейчас, не кодируйте это.

Комментарии:

1. согласен — код необходимо изменить, как только эти аргументы станут определенными, и верный способ гарантировать, что эти изменения будут внесены, — не предоставлять средств их передачи 🙂

Ответ №2:

«кое-что» довольно расплывчато. Это что-то, что могло бы использоваться для передачи в интерфейсе? Что-то вроде: Execute(start_time, end_time, DataSet, IValidationRule) где IValidationRule находится:

 public interface IValidationRule
{
    bool IsValid(DataSet data);
}
  

Это обеспечило бы вам максимальную гибкость при подключении различных «перехватов проверки» с сильно изменяющейся структурой по мере изменения требований. Я бы, вероятно, создал свой собственный тип возвращаемого значения, например ValidationResult или что-то в этом роде. Вы можете закодировать неоднозначность структуры, если сможете принудительно применить контракт к требуемому поведению.

Если у вас нет ни малейшего представления о том, как будет выглядеть структура ИЛИ поведение «зацепок», я бы согласился с taylonr. Вы не можете смоделировать что-то настолько далеко в левом поле.