Передача объекта данных или частей объекта данных в методы? - PullRequest
1 голос
/ 04 марта 2011
public class DataObject{
    public int Value1;
    public int Value2;
    public int Value3;
    public int Value4;
    public int Value5;

    public DataObject(){}
}

public class SomeClass{
    public SomeClass(){}
    public void MultiplyFirstThreeValues(int Value1, int Value2, int Value3){
        return Value1*Value2*Value3;
    }
    public void MultiplyFirstThreeValues(DataObject d){
        return d.Value1*d.Value2*d.Value3;
    }
}

Что является лучшей практикой - отправлять каждую переменную, необходимую для метода или всего объекта данных (в случае, если не каждая переменная в объекте данных используется)?Это может быть вопрос «искусство больше, чем наука», но если вы не можете дать жесткое и быстрое правило, то мне было бы интересно услышать, что будет мотивом сделать одно над другим (в данном случае, когда нет).все значения объекта данных используются в методе).

Спасибо, я с нетерпением жду, чтобы узнать больше об этом.

Ответы [ 4 ]

4 голосов
/ 04 марта 2011

Я бы выбрал вариант C , чтобы оставить логику внутри самого объекта:

  public class DataObject
  {
    private int Value1;
    private int Value2;
    private int Value3;
    private int Value4;
    private int Value5;

    public DataObject(){}

    public int MultiplyFirstThreeValues()
    {
        return Value1*Value2*Value3;
    }
 }

Edit: В ответ на комментарий - добавлю цитату:

Процедурный код получает информацию тогда принимает решения. Объектно-ориентированный код говорит объектам что-то делать.

Это просто лучший подход к проектированию, поскольку он позволяет скрыть способ, которым вы на самом деле получаете свои результаты / выполняете свою реализацию. То, как вы сейчас его настроили, больше отражает шаблон Visitor , который может быть мощным, но также добавляет сложности, поскольку интерфейс вашего класса теперь имеет всех этих открытых членов. Если ваш расчет будет охватывать несколько DataObject и / или других типов, это на самом деле может иметь смысл, но я бы определенно использовал инкапсуляцию, если мне это удастся.

1 голос
/ 04 марта 2011

Считается, что сигнатура метода со многими входными параметрами указывает на отсутствие класса.Сколько их много?Невозможно сказать, но три не поражают меня, как особенно многих.

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

1 голос
/ 04 марта 2011

Практическое правило: если у вас есть более 7 параметров (хотя некоторые скажут более 3), рассмотрите возможность использования Ввести параметры объекта рефакторинг.

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

Если вышеупомянутое не соответствует действительности (вы ожидаете изменений в числах / типах параметров и / или у вас их много), используйте объект.


Примечание:

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

0 голосов
/ 04 марта 2011

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

...