2017-01-03 4 views
1

Я довольно новичок в C# и программировании в целом, поэтому почему я задаю этот вопрос.Использование структур или классов в качестве параметров

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

public List<Items> DoSomething(List<OtherItems> someItems, int amountOfItems, 
    DbGeopgrahpy Location) 
{ //More stuff, irrelevant to the question. 

Он указал, что я должен поставить amountOfItems и Location в классе, который будет содержать эти значения вместо этого.

Этот метод вызывается из контроллера, который возвращает эти данные клиенту.

Теперь мой вопрос: почему? Я понимаю, что это улучшит читаемость (возможно, imo), но есть ли преимущества использования классов в качестве параметров? Я думаю, что могу предположить, что это повлияло бы на производительность отрицательно, когда вы должны объявлять класс каждый раз, когда хотите вызвать этот метод.

Я также обнаружил, что структуры могут использоваться таким образом, если это хорошая практика, когда следует использовать структуры и когда я должен использовать классы?

+2

* Теперь мой вопрос, почему * - почему ты не спросил его? Существует много существующих тем «struct vs class», например. [Здесь] (http://stackoverflow.com/q/3942721/1997232). – Sinatr

+0

@ Синатр да, я понимаю свою ошибку там, этот человек сейчас не в компании, поэтому я больше не могу задавать вопросы. Кроме того, я знаю об использовании structs vs classes, но когда я должен использовать их в качестве параметров? – RandomStranger

+1

Спросите себя, обладает ли этот потенциальный класс/структура, состоящий из этих двух параметров, более обычным, чем только в этом вызове? У вас есть идея для значимого имени для такого класса, кроме «MyLovelyClassUsedToCallDoSomething». Если не забыть. – Ralf

ответ

4

Одним из преимуществ использования класса DTO как аргумента метода вместо сбора параметров является предотвращение модификации сигнатуры в будущем. Это может быть полезно для общедоступных методов API, например, так как вы можете изменять API без нарушения изменений/версий версий.

Предположим, вам необходимо обновить/изменить метод, поэтому вам нужно передать дополнительный аргумент. Если ваш метод ожидает только одного аргумента, то есть class/struct, вам не нужно менять подпись метода. Вместо этого вы просто добавляете дополнительное свойство в свой класс DTO.

+0

А это имеет смысл. Я был в основном обеспокоен тем, что это запутывает, так как тот, кто хочет вызвать эту функцию, должен искать класс/структуру вместо чтения параметров. – RandomStranger

0

Лично я считаю, что если у меня есть более 3 или 4 параметра, которые логически сгруппированы (принадлежат к одному и тому же виду объекта или информации), то я буду использовать класс.

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

2

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

//avoid 
public void Checkout(string shippingName, string shippingCity, 
     string shippingSate, string shippingZip, string billingName, 
     string billingCity, string billingSate, string billingZip) 
{ 

} 

//DO 
public void Checkout(ShippingAddress shippingAddress,BillingAddress billingAddress) 
{ 
} 

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

+0

Но разве это не смущает создание класса каждый раз, когда вы хотите вызвать метод? Кроме того, не повлияет ли это на производительность негативно? – RandomStranger

+0

Нет, не каждый раз. Не поймите. Идея состоит в том, что вы можете сгруппировать параметры, которые, вероятно, будут реагировать на один и тот же объект. Я добавлю пример, чтобы вы могли понять это. – NicoRiff

+0

Я вижу, так это в основном, когда вы хотите облегчить чтение и когда захотите повторно использовать параметры? – RandomStranger

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