использовать сеттеры или конструктор с аргументами
От: ChistovSE  
Дата: 11.10.10 07:02
Оценка:
Здравствуйте,
Скажите пожалуйста, какой стиль лучше использовать?
Маленькая вырезка из кода:

class A{
A(int _incoming, int _outgoing){
outgoing = _outgoing;
incoming = _incoming;
int incoming;
int outgoing;
};

....

A a1( 2 , 3);

или лучше написать сеттеры для incoming и outgoing, потому что не очень понятно из конструктора что за 2 и 3 ?
или какой-то третий вариант ?
-------------------------
Сергей Ч.
Нижний Новгород
Re: использовать сеттеры или конструктор с аргументами
От: frёёm Россия  
Дата: 11.10.10 07:21
Оценка: +4
Я стараюсь в конструктор выносить обязательные и неизменяемые в дальнейшем параметры, остальное — через сеттеры.
Ни что в жизни ни даёться так просто как... хотелось бы...
Re: использовать сеттеры или конструктор с аргументами
От: Aikin Беларусь kavaleu.ru
Дата: 11.10.10 09:49
Оценка:
Здравствуйте, ChistovSE, Вы писали:

CSE> или лучше написать сеттеры для incoming и outgoing, потому что не очень понятно из конструктора что за 2 и 3 ?

CSE> или какой-то третий вариант ?
Напиши лучше как это A будет использоваться. Без этого оба варианта (и даже третий с четвертым) будут неправильные.

СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[2]: использовать сеттеры или конструктор с аргументами
От: ChistovSE  
Дата: 12.10.10 04:50
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Напиши лучше как это A будет использоваться. Без этого оба варианта (и даже третий с четвертым) будут неправильные.


A>СУВ, Aikin


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

A a1(пар-ры первого бриджа),a2(пар-ры второго бриджа); // параметры, например: vlanTag, номера портов, какой траффик генератор использовать

sendTraffic(a1,ещё 1-2 параметра);
-------------------------
Сергей Ч.
Нижний Новгород
Re[2]: использовать сеттеры или конструктор с аргументами
От: ChistovSE  
Дата: 12.10.10 04:56
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Напиши лучше как это A будет использоваться. Без этого оба варианта (и даже третий с четвертым) будут неправильные.


A>СУВ, Aikin

Ещё забыл написать, что время от времени, в бридже меняются порты с тагированных на не тагированные и порты могут исключаться из бриджа.
-------------------------
Сергей Ч.
Нижний Новгород
Re[3]: использовать сеттеры или конструктор с аргументами
От: Aikin Беларусь kavaleu.ru
Дата: 12.10.10 07:00
Оценка:
Здравствуйте, 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: использовать сеттеры или конструктор с аргументами
От: chocho Россия  
Дата: 13.10.10 08:44
Оценка:
Здравствуйте, 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);
     }
   
     //...
}
"Не морочьте мне голову. Полыхаев" ©
Re: использовать сеттеры или конструктор с аргументами
От: Tom Россия http://www.RSDN.ru
Дата: 25.10.10 14:08
Оценка: +1
Лучше руководствоваться такой логикой — конструирование обьекта полностью должно выполняться и завершаться конструктором обьекта.
Тогда всегда "имея на руках" обьект ты знаешь что он всегда, полностью, успешно сконструирован. Всё что надо инициализировать — инициализировано и никакой сеттер не был забыт. Соответственно если какие то данные обьекта могут меняться при этом сам обьект будет работоспособен — их можно вынести в сеттеры.
При этом их так же можно инициализировать и в конструкторе.
Народная мудрось
всем все никому ничего(с).
Re: использовать сеттеры или конструктор с аргументами
От: __kot2  
Дата: 03.11.10 11:55
Оценка:
Здравствуйте, 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>   };

ну, public, private опускаю..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.