насколько явно я должен быть с моими перегрузками? - PullRequest
1 голос
/ 30 марта 2009

Я создаю оболочку для jquery-плагина для C #, и мне не нравится использование [Необязательно], потому что это не так «необязательно», как говорится (то есть вы все равно должны объявить эту библиотеку System.Missing) поэтому я решил использовать перегруженные методы. Я хочу дать пользователю много настроек, но я не уверен, насколько явно я должен быть с моими перегрузками. Должен ли я разбить его с точки зрения важности для параметров или сделать перегрузку для каждого сценария.

Что означает отпечаток при перегрузках? Снижается ли эффективность? Это осуждается с точки зрения ООП?

PS Я вызываю конструктор базового класса и должен использовать метод base(param1, param2, ...), но я также хотел бы использовать this(param1, param2, ...) вместо инициализации переменных-членов в каждом сценарии, есть ли способ обойти это?

Ответы [ 2 ]

2 голосов
/ 30 марта 2009

Запутывающий API - это вечная проклятие для пользователей библиотек. Упростите, даже тривиально, людям возможность точно решить, что они хотят делать, учитывая предоставляемый вами интерфейс. Если они должны выбирать из длинного списка перегруженных функций, это, вероятно, слишком большая когнитивная нагрузка. Также стоит отметить, что C # 4 будет иметь поддержку необязательных и именованных параметров, поэтому ваша проблема System.Missing исчезнет сама собой.

Это осуждается с точки зрения ООП?

ООП предпочитает Принцип единой ответственности , или SRP. Если у вас есть один класс со многими из этих функций, каждая из которых имеет много перегрузок, это говорит о том, что он может делать слишком много.

Снижается ли эффективность?

Если у вас много перегрузок для одного и того же метода, статически разрешает каждый вызов функции дольше (т. Е. "Какой метод с этим именем является правильным?"). Но это не окажет влияния во время выполнения на производительность, если они не виртуальные вызовы - то есть, когда компилятор может статически точно знать, что это будет за тип. В любом случае, я не думаю, что это должно быть вашим мотивирующим фактором здесь.

1 голос
/ 30 марта 2009

Если у вас много параметров и вам нужно расширяться, рассмотрите возможность использования класса, содержащего ваши параметры.

* 1003 Е.Г. *

public class FileOptions
{
  public bool Indented { get; set; }
  public string Namespace { get; set; }
  public System.Text.Encoding Encoding { get; set; }
}

public void Save(string fileName, FileOptions options) { ... }

// usage:

obj.Save("a.xml", new FileOptions { Indented=true });
obj.Save("b.xml", new FileOptions { Namespace="urn:foo", Encoding=System.Text.Encoding.UTF8 });
...