Лучше руководствоваться такой логикой — конструирование обьекта полностью должно выполняться и завершаться конструктором обьекта.
Тогда всегда "имея на руках" обьект ты знаешь что он всегда, полностью, успешно сконструирован. Всё что надо инициализировать — инициализировано и никакой сеттер не был забыт. Соответственно если какие то данные обьекта могут меняться при этом сам обьект будет работоспособен — их можно вынести в сеттеры.
При этом их так же можно инициализировать и в конструкторе.
Народная мудрось
всем все никому ничего(с).
использовать сеттеры или конструктор с аргументами
Здравствуйте, ChistovSE, Вы писали:
CSE> или лучше написать сеттеры для incoming и outgoing, потому что не очень понятно из конструктора что за 2 и 3 ? CSE> или какой-то третий вариант ?
Напиши лучше как это A будет использоваться. Без этого оба варианта (и даже третий с четвертым) будут неправильные.
СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[2]: использовать сеттеры или конструктор с аргументами
Здравствуйте, Aikin, Вы писали:
A>Напиши лучше как это A будет использоваться. Без этого оба варианта (и даже третий с четвертым) будут неправильные.
A>СУВ, Aikin
Использоваться будет так ...
A — это класс описывающий поведение траффика внутри железки, где настроен бриджинг между отдельными портами. Объекты этого класса, я хочу использовать для функций посылки траффика. Код примерно такой:
A a1(пар-ры первого бриджа),a2(пар-ры второго бриджа); // параметры, например: vlanTag, номера портов, какой траффик генератор использовать
sendTraffic(a1,ещё 1-2 параметра);
-------------------------
Сергей Ч.
Нижний Новгород
Re[2]: использовать сеттеры или конструктор с аргументами
Здравствуйте, Aikin, Вы писали:
A>Напиши лучше как это A будет использоваться. Без этого оба варианта (и даже третий с четвертым) будут неправильные.
A>СУВ, Aikin
Ещё забыл написать, что время от времени, в бридже меняются порты с тагированных на не тагированные и порты могут исключаться из бриджа.
-------------------------
Сергей Ч.
Нижний Новгород
Re[3]: использовать сеттеры или конструктор с аргументами
Здравствуйте, ChistovSE, Вы писали:
CSE>Использоваться будет так ... CSE> A — это класс описывающий поведение траффика внутри железки, где настроен бриджинг между отдельными портами. Объекты этого класса, я хочу использовать для функций посылки траффика. Код примерно такой: CSE> A a1(пар-ры первого бриджа),a2(пар-ры второго бриджа); // параметры, например: vlanTag, номера портов, какой траффик генератор использовать CSE> sendTraffic(a1,ещё 1-2 параметра);
Никогда с такой предметной областью не сталкивался. Поэтому мне опять мало информации. Ты бы законченый кусок кода привел (создание a1, a2, A, использование A).
А раз информации мало, то буду придумывать. Вдруг угадаю
1) У А всего 2 параметра a1, a2, это А в течении жизни не меняется. Тогда однозначно конструктор:
var a1 = new a(...);
// настраиваем a1 дальшеvar a2 = new a(...);
// настраиваем a2 дальшеvar a = new A(a1, a2);
//пошло использование
2) Параметров больше, но возможные значения разбиваются на несколько четких групп
var a1 = new a(...);
// настраиваем a1 дальшеvar a2 = new a(...);
// настраиваем a2 дальшеvar a = A.CreateBlaBlaBlaWithLinearGeneratorWithBlackJack(a1, a2);
//пошло использование
Ну и таки далее
А вообще главным критерием я бы назвал удобство использования.
И вообще не заморачивался над вопросом. Только в случае если это ключевой объект системы и нам его нужно создавать ну просто везде. Тогда да, можно и заморочиться над удобством использования.
СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re: использовать сеттеры или конструктор с аргументами
Здравствуйте, ChistovSE, Вы писали:
CSE>Здравствуйте, CSE> Скажите пожалуйста, какой стиль лучше использовать?
class A
{
private readonly Int32 m_incoming;
private readonly Int32 m_outgoing;
private A(int incoming, int outgoing)
{
m_incoming = outgoing;
m_incoming = incoming;
}
public static A MakeDefault()
{
return new A(5, 10);
}
public static A MakeSpecific(int incoming, int outgoing)
{
return new A(incoming, outgoing);
}
//...
}
Здравствуйте, ChistovSE, Вы писали:
CSE>Здравствуйте, CSE> Скажите пожалуйста, какой стиль лучше использовать?
если нет никаких "противопоказаний" то я всегда предпочту неизменяемый обьект — тот что инициализируется в конструкторе и никогда больше не меняется. отладка становится проще.
сеттеры-геттеры это в общем-то всегда полукостыли. сеттеры — потому что меняют состояние обьекта и при том часто частично, без проверки целостности
setТо-то
setЧе-то
между то-то и се-то вылетело исключение — обьект останется в испорченном виде
если обьект сложный то сеттер будет громоздким и так, как часто переписывает почти все поля то по сути попирует функционал конструктора. а от любого копипаста и дублирования функционала
в том числе например, приведенного тут
public static A MakeDefault()
{
return new A(5, 10);
}
public static A MakeSpecific(int incoming, int outgoing)
{
return new A(incoming, outgoing);
}
стоит избавляться. нам же не хочется чтобы весь проект был полон зависимостей и изменения в одном месте влекли обязательную нужду изменений в пяти других?
геттеры плохи потому что часто это просто функция которая возвращает некое поле. когда у нас обьект константый то можно напрямую читать это поле и никакой геттер не нужен
конкретно С++ позволяет записывать такие конструкторы компактнее:
CSE> class A{
CSE> A(int incoming, int outgoing) : incoming(incoming), outgoing(outgoing){}
CSE> int incoming;
CSE> int outgoing;
CSE> };