Re[7]: Прокритикуйте код на C#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.01.11 09:05
Оценка:
Здравствуйте, -VaS-, Вы писали:

VS>Понятно. Для библиотек согласен. Но делать всегда свойства вместо полей — паранойя. Смешно видеть у того же Фаулера в книжке по DSL вот такое:


VS>
VS>class Activity...
VS>  public string Type { get; set; }
VS>  public int Amount { get; set; }
VS>  public int Revenue { get; set; }
VS>  public string Location { get; set; }
VS>


VS>Это чисто data-класс. Никакого поведения там никогда не будет.


Так собственно какие преимущества имеет поле перед данной записью, кроме кол-ва символов?

VS>>>Свойства не являются механизмом инкапсуляции. Так же, как и методы, возвращающие состояние объекта.

HL>>В чем принципиальное отличие свойства от пары методов Get/Set, кроме синтаксического сахара?

VS>Ни в чем, о том и речь. Я лишь хотел сказать, что обернув приватное поле свойством или парой методов get/set, вы нарушаете инкапсуляцию — внутреннее состояние выставлено наружу, и от того, что это красивое свойство, а не ужасное паблик-поле, ситуация не меняется.

Выше приводили аргументы, чем паблик свойства лучше паблик полей. В пользу полей что-то есть?
Re[7]: Прокритикуйте код на C#
От: Lloyd Россия  
Дата: 12.01.11 09:13
Оценка:
Здравствуйте, -VaS-, Вы писали:

VS>Смешно видеть у того же Фаулера в книжке по DSL вот такое:


Кстати, как книжка? Стоящая?
Re[5]: Прокритикуйте код на C#
От: __gas  
Дата: 12.01.11 09:14
Оценка: -1
Здравствуйте, MozgC, Вы писали:
MC>

Директор:
MC> — Паша, что за фигня, почему я 20 минут готовил документы, потом нажал на Help и приложение закрылось?
MC> — Все нормально, Саш, все по гайдлайнам, там один компонентик выкинул недокументированное (неожиданное) исключение при открытии хелпа, а мы такие исключения ловить не должны — закрываемся, все по правилам!
MC> — ... (Директор посылает меня с такими правилами кое куда)


Лучше представьте куда пошлет Вас директор, когда приложение, беззвучно проглотив очередное исключение, потрет все документы на его машине, а заодно и базы с фин. отчетами. Неожиданное исключение — это однозначная смерть приложения, причем чем скорее — тем меньше вреда. Это не отменяет логгирование и какие-то меры (если возможно) по мягкому восстановлению (как в офисах, к примеру).
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Re[7]: Прокритикуйте код на C#
От: HowardLovekraft  
Дата: 12.01.11 09:39
Оценка: +1
Здравствуйте, -VaS-, Вы писали:

VS>Это чисто data-класс. Никакого поведения там никогда не будет.

Жили-были POCO. С public-полями. Были они "чисто data-классами".
А потом из них решили сделать self-tracking entities... и настал апокалипсис.

VS>Ни в чем, о том и речь. Я лишь хотел сказать, что обернув приватное поле свойством или парой методов get/set, вы нарушаете инкапсуляцию

ORLY?
Выставляя наружу свойство, я скрываю реализацию механизма получения/установки значения этого свойства.
Если я завтра вместо тривиального
get { return this.myProperty; }
set { this.myProperty = value; }

захочу реализовать какой-нить INotifyPropertyChanged, я его спокойно реализую и никто не помрет.
Либо изменю логику так, что свойство не будет отображаться на приватное поле 1-1.

В случае с public-полем — придется переделать контракт.

Ума не приложу, откуда такая категоричность — "никогда не будет"? Вы Б-г? Ну или хотя бы Нострадамус?
Re[8]: Прокритикуйте код на C#
От: -VaS- Россия vaskir.blogspot.com
Дата: 12.01.11 11:08
Оценка:
L>Кстати, как книжка? Стоящая?

Мне она показалась несколько устаревшей. Видимо, слишком долго он ее писал. Выразительность internal DSLs у него ограничивается возможностями Java, C# и Ruby (хотя последний в принципе ничего). Хотя есть целая книжка показывающая, чего можно достичь в рамках существующего языка (Boo). С другой стороны, автору удалось зацепить меня разработкой external DSL (ANTLR) Но последний у него рассмотрен скупо и местами с применением не best practics (обход AST в коде вместо создания tree grammar). В общем, если DSL для вас совершенно новая область, то прочитать стоит хотя бы потому, что это Фаулер Исли нет, то что-то новое вы там, скорее всего, не найдете. Ощущения основопологающего труда книга явно не производит.
Re[8]: Прокритикуйте код на C#
От: -VaS- Россия vaskir.blogspot.com
Дата: 12.01.11 11:13
Оценка: +1
S>Так собственно какие преимущества имеет поле перед данной записью, кроме кол-ва символов?

Поля проще. Если я вижу конструкцию, более сложную, чем она могла бы быть, у меня сразу возникает вопрос — зачем? Какие скрытые проблемы решаются? Любое усложнение кода должно быть чем-то продиктовано.

VS>>Ни в чем, о том и речь. Я лишь хотел сказать, что обернув приватное поле свойством или парой методов get/set, вы нарушаете инкапсуляцию — внутреннее состояние выставлено наружу, и от того, что это красивое свойство, а не ужасное паблик-поле, ситуация не меняется.

S>Выше приводили аргументы, чем паблик свойства лучше паблик полей. В пользу полей что-то есть?

См. выше.
Re[8]: Прокритикуйте код на C#
От: -VaS- Россия vaskir.blogspot.com
Дата: 12.01.11 11:18
Оценка: +1
HL>Ума не приложу, откуда такая категоричность — "никогда не будет"? Вы Б-г? Ну или хотя бы Нострадамус?

Если рассужать как вы, то все private члены не sealed класса надо делать protected — а вдруг захочется вызвать из наследника (я такое видел)? И virtual — а вдруг захочется переопределить? Не надо писать код, который не нужен прямо сейчас или 210% будет нужен завтра (но не послезавтра). Это не касается публичных (для команды) контрактов.
Re[9]: Прокритикуйте код на C#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.01.11 12:44
Оценка: :)
Здравствуйте, -VaS-, Вы писали:

S>>Так собственно какие преимущества имеет поле перед данной записью, кроме кол-ва символов?


VS>Поля проще.

Чем поля проще?

VS>Если я вижу конструкцию, более сложную, чем она могла бы быть, у меня сразу возникает вопрос — зачем? Какие скрытые проблемы решаются? Любое усложнение кода должно быть чем-то продиктовано.

Преимущества свойств описаны выше. А тема простоты полей по отношению к свойствам пока не раскрыта...
Re[9]: Прокритикуйте код на C#
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 12.01.11 15:12
Оценка: :)
Здравствуйте, -VaS-, Вы писали:

VS>Если рассужать как вы, то все private члены не sealed класса надо делать protected — а вдруг захочется вызвать из наследника (я такое видел)? И virtual — а вдруг захочется переопределить? Не надо писать код, который не нужен прямо сейчас или 210% будет нужен завтра (но не послезавтра). Это не касается публичных (для команды) контрактов.


Нет. protected-контракт — это тоже контракт, и его надо проектировать не менее тщательно, чем публичный. Вообще суть спора мне непонятна. Кстати, обратите внимание, что генераторы клиентских частей для WCF и веб-сервисов почему-то генерят свойства, а не поля. К чему бы это, не знаете?
[КУ] оккупировала армия.
Re[12]: Прокритикуйте код на C#
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 12.01.11 15:21
Оценка:
Здравствуйте, Sinix, Вы писали:

S>rsdn такой rsdn... Пока не напишешь дисклаймер на 5 страниц "не рассматриваем очень частные случаи, включаем свои мозги" — не отстанут


А чего ты удивляешься? Тут же технари все с техническим образованием. А чему нас (и, надеюсь, вас тоже) учили? "Нельзя" == "НЕЛЬЗЯ", а не "Нельзя" == "Нельзя, но ...(тут куча оговорок)". Правила математической логики, панимаешь В ней не бывает ответов вроде "да нет наверное"
[КУ] оккупировала армия.
Re[7]: Прокритикуйте код на C#
От: Angler Россия  
Дата: 12.01.11 15:28
Оценка:
Здравствуйте, samius, Вы писали:


S>Т.е. я согласен, что catch(Exception) быть не должно в идеале.


А чем плох catch(Exception) c re-throw в дебрях и логированием/сообщением об ошибке на самом верхнем уровне?
Re[2]: Прокритикуйте код на C#
От: Angler Россия  
Дата: 12.01.11 15:31
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>
HL>catch (Exception e)
HL>

HL>Why catch(Exception)/empty catch is bad.

Вы сами читали-то что там пишут?
Повторяю вопрос 3-й раз за сегодня — чем плох catch (Exception) + re-throw?
Re[13]: Прокритикуйте код на C#
От: Sinix  
Дата: 12.01.11 15:34
Оценка:
Здравствуйте, koandrew, Вы писали:


K>"Нельзя" == "НЕЛЬЗЯ", а не "Нельзя" == "Нельзя, но ...(тут куча оговорок)".


Мы же не в этюдах, нет?
Для инженерных тем "делать надо так" == "Если не понимаешь последствий, по-другому лучше не делать. Чтобы толково объяснить — почему, придётся пройти ускоренный курс хождения по граблям с глубоким погружением в матчасть. Поскольку ты не сделал этого сам, тебе оно не надо. Так что делать надо так."
Re[8]: Прокритикуйте код на C#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.01.11 16:12
Оценка:
Здравствуйте, Angler, Вы писали:

A>Здравствуйте, samius, Вы писали:



S>>Т.е. я согласен, что catch(Exception) быть не должно в идеале.


A>А чем плох catch(Exception) c re-throw в дебрях и логированием/сообщением об ошибке на самом верхнем уровне?

Что за дебри?

Если речь об этом
Автор: Angler
Дата: 12.01.11
, то оно называется log & throw.
Re[9]: Прокритикуйте код на C#
От: Angler Россия  
Дата: 12.01.11 16:32
Оценка:
Здравствуйте, samius, Вы писали:



S>Если речь об этом
Автор: Angler
Дата: 12.01.11
, то оно называется log & throw.


Да что ты цепляешься за этот log? Пусть будет так:

catch(Exception e)
            {

                //уберём за собой
                resultList.ForEach(item => item.Dispose());

                //какая нам нафиг разница, что там случилось при заполнении? 
                //пусть клиент разбирается);
                throw;
            }


Чем это плохо?
Re[10]: Прокритикуйте код на C#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.01.11 16:44
Оценка:
Здравствуйте, Angler, Вы писали:

A>Здравствуйте, samius, Вы писали:


S>>Если речь об этом
Автор: Angler
Дата: 12.01.11
, то оно называется log & throw.


A>Да что ты цепляешься за этот log? Пусть будет так:


A>
A>catch(Exception e)
A>            {

A>                //уберём за собой
A>                resultList.ForEach(item => item.Dispose());

A>                //какая нам нафиг разница, что там случилось при заполнении? 
A>                //пусть клиент разбирается);
A>                throw;
A>            }
A>


A>Чем это плохо?


А тут все неплохо, если не будет исключений в item.Dispose()
Re[11]: Прокритикуйте код на C#
От: Angler Россия  
Дата: 12.01.11 16:54
Оценка:
Здравствуйте, samius, Вы писали:

S>А тут все неплохо


А это как понимать?

Т.е. я согласен, что catch(Exception) быть не должно в идеале.


"неплохо" и "идеал" две большие разницы, не находишь? Так чем же таки catch(Exception)+rethrow хуже?
Re[12]: Прокритикуйте код на C#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.01.11 17:09
Оценка:
Здравствуйте, Angler, Вы писали:

A>Здравствуйте, samius, Вы писали:


S>>А тут все неплохо


A>А это как понимать?

A>

A>Т.е. я согласен, что catch(Exception) быть не должно в идеале.


A> "неплохо" и "идеал" две большие разницы, не находишь? Так чем же таки catch(Exception)+rethrow хуже?

Я разве утверждал что catch + rethrow хуже? В чем суть претензий ко мне?
Re[13]: Прокритикуйте код на C#
От: Angler Россия  
Дата: 12.01.11 17:12
Оценка:
Здравствуйте, samius, Вы писали:

A>> "неплохо" и "идеал" две большие разницы, не находишь? Так чем же таки catch(Exception)+rethrow хуже?

S>Я разве утверждал что catch + rethrow хуже? В чем суть претензий ко мне?

Какие претензии? Спокойствие Мне было интересно обоснование твоей же фразы — "catch(Exception) быть не должно в идеале"
Re[14]: Прокритикуйте код на C#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.01.11 17:14
Оценка: +1
Здравствуйте, Angler, Вы писали:

A>Здравствуйте, samius, Вы писали:


A>>> "неплохо" и "идеал" две большие разницы, не находишь? Так чем же таки catch(Exception)+rethrow хуже?

S>>Я разве утверждал что catch + rethrow хуже? В чем суть претензий ко мне?

A>Какие претензии? Спокойствие Мне было интересно обоснование твоей же фразы — "catch(Exception) быть не должно в идеале"

Боюсь, что ты пропустил контекст обсуждения. Я имел в виду catch(Exception) без проброса, как это в коде ТС.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.