Хорошие ресурсы для изучения [закрытого] Objective C

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

у Вас есть несколько опций:

переключатель от конструктора к методам set свойства . Это может сделать код более читаемым, потому что это очевидно для читателя, которому значение соответствует который параметры. Объектный синтаксис Инициализатора делает этот взгляд хорошим. Также просто реализовать, так как можно просто использовать автоматически сгенерированные свойства и пропуск, пишущий конструкторам.

class C
{
    public string S { get; set; }
    public int I { get; set; }
}

new C { S = "hi", I = 3 };

Однако Вы теряете неизменность, и Вы теряете способность гарантировать, что необходимые значения установлены перед использованием объекта во время компиляции.

разработчик Pattern .

Думают об отношениях между string и StringBuilder. Можно получить это для собственных классов. Мне нравится реализовывать его как вложенный класс, таким образом, класс C связал класс C.Builder. Мне также нравится быстрый интерфейс на разработчике. Сделанный правильно, можно получить синтаксис как это:

C c = new C.Builder()
    .SetX(4)    // SetX is the fluent equivalent to a property setter
    .SetY("hello")
    .ToC();     // ToC is the builder pattern analog to ToString()

// Modify without breaking immutability
c = c.ToBuilder().SetX(2).ToC();

// Still useful to have a traditional ctor:
c = new C(1, "...");

// And object initializer syntax is still available:
c = new C.Builder { X = 4, Y = "boing" }.ToC();

у меня есть сценарий PowerShell, который позволяет мне генерировать код разработчика, чтобы сделать все это, где вход похож:

class C {
    field I X
    field string Y
}

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

"Представляют Объект параметра" рефакторинг . Посмотрите Осуществлять рефакторинг Каталог . Идея состоит в том, что Вы берете некоторые параметры, Вы являетесь передающими и вставляете их к новому типу, и затем передаете экземпляр того типа вместо этого. Если Вы сделаете это без взглядов, Вы закончите назад, где Вы запустили:

new C(a, b, c, d);

становится

new C(new D(a, b, c, d));

Однако, этот подход имеет самый большой потенциал для оказывания положительного влияния на код. Так, продолжите путем выполнения этих шагов:

  1. Ищут подмножества из параметров, которые имеют смысл вместе. Просто бессмысленно собирание в группу всех параметров функции не получает Вас очень; цель состоит в том, чтобы иметь группировки, которые имеют смысл. Вы будете знать, что разобрались в нем, когда название нового типа очевидно.

  2. Ищут другие места, где эти значения используются вместе и используют новый тип там, также. Возможности при нахождении хорошего нового типа для ряда значений, которые Вы уже используете повсеместно, что новый тип будет иметь смысл во всех тех местах, также.

  3. Ищут функциональность, которая находится в существующем коде, но принадлежит на новом типе.

, Например, возможно, Вы видите некоторый код, который похож:

bool SpeedIsAcceptable(int minSpeed, int maxSpeed, int currentSpeed)
{
    return currentSpeed >= minSpeed & currentSpeed < maxSpeed;
}

Вы могли взять minSpeed и maxSpeed параметры и поместить их в новый тип:

class SpeedRange
{
   public int Min;
   public int Max;
}

bool SpeedIsAcceptable(SpeedRange sr, int currentSpeed)
{
    return currentSpeed >= sr.Min & currentSpeed < sr.Max;
}

Это лучше, но действительно использовать в своих интересах новый тип, перемещать сравнения в новый тип:

class SpeedRange
{
   public int Min;
   public int Max;

   bool Contains(int speed)
   {
       return speed >= min & speed < Max;
   }
}

bool SpeedIsAcceptable(SpeedRange sr, int currentSpeed)
{
    return sr.Contains(currentSpeed);
}

И теперь мы добираемся где-нибудь: реализация [1 115] теперь говорит, что Вы имеете в виду, и у Вас есть полезный, допускающий повторное использование класс. (Следующий очевидный шаг должен сделать SpeedRange в к [1 117].)

, Как Вы видите, Представьте Объект параметра, было хорошее начало, но его действительное значение было то, что он помог нам обнаружить полезный тип, который отсутствовал в нашей модели.

7
задан Community 23 May 2017 в 10:29
поделиться

1 ответ

32
ответ дан 6 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: