2015-04-21 1 views
1

Если у меня есть класс, и этот класс имеет много свойств. Теперь я хочу создать конкретный метод, принадлежащий этому классу, который должен принимать 6 параметров.Должен ли я использовать метод экземпляра в качестве альтернативы статическому методу, если мне нужно передать много параметров?

Мой вопрос:

  • Должен ли я создать этот метод как статический метод и передать шесть параметров?

или

  • Создать метод экземпляра, чтобы избежать прохождения многих параметров? (Заполнить объект вместо передачи параметров)

Здесь я спросить о лучшей практике от объекта ориентированной проектной точки зрения.

+0

Независимо от того, что работает для вашего случая ... Обычно 6 параметров - это слишком много, но какой рефакторинг (если есть) использовать для изменения, это в основном личный выбор. –

+1

Почему бы вам не создать POCO, который будет хранить все эти вещи, а затем метод, который принимает экземпляр этого класса? – MarcinJuraszek

+0

Имеете ли вы метод, который принимает 6 параметров или метод, который принимает один параметр, который является объектом с шестью свойствами, он не изменяет читаемость IMO. Лучшей практикой будет реорганизация вашего кода, чтобы у вас не было такого большого метода. – Nathan

ответ

1

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

Методы экземпляров проще вызвать, чем статические методы. Легче читать и писать customer.GetOrders(), чем Customer.GetOrders(customer). Если для этого метода нужен доступ к закрытым членам экземпляра, доступ к этим элементам не требует ссылки на объект (и типизация this обычно не требуется).

Статические методы полезны в ограниченном числе случаев. Например, ранее существовавшая ссылка на экземпляр не имеет смысла при реализации шаблона фабрики. Вы можете создать библиотеку, которая выполняет операции над несколькими объектами того же типа, где это не обязательно считается более предпочтительным, чем другое, например Math.Max(first, second).

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

Также учтите, что статические методы могут затруднить тестирование. Возьмем следующий пример:

public bool IsOrderDateValid() 
{ 
    return (DateTime.Now <= _orderDate); 
} 

DateTime.Now статический. В автоматическом тесте вы можете установить _orderDate на постоянное значение, но DateTime.Now будет зависеть от системных часов вашей тестовой среды. Это может привести к непоследовательным результатам.

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

1

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

1

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

Смежные вопросы