Pull to refresh

Comments 21

бесит, когда код пишут паттернами, бездумно, просто потому что они есть, потому что так «правильно», и вместо одной строчки кода у вас тоже строчка + новый файл с классом из десяти строк
И тут же
Не используйте публичные поля, у вас есть property и IDE пишет их за вас
Вот когда понадобится перехватывать запись в Name, вот тогда и заменю его на property, а заранее то зачем?

А затем, что бы другому разработчику не надо было лазить в ваш код.Написали название с типом и Ctrl+Shift+C, все готово. Вам, что жалко?

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

Так лишние строки из ниоткуда появляются, и какая от них польза, непонятно.

Чем «свойство» спасёт стороннего разработчика от необходимости залазить в ваш код? Разве что у вас VCL-компонент, а свойство published, и тогда его можно настроить из IDE, но в примере это не так.

Я подумал, почему же все таки свойства, и понял вот что:

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

  2. Вот о чем я не написал, не здесь, ни в посте, так это о единообразии. Может быть, это вкусовщина, или даже мания, но меня бесит когда его нет. Когда в одном месте свойства, в другом поля. Или хуже того в одном классе и то и другое. Может быть это мое личное, но не порядочек.

  3. Есть все таки семантическая разница, между полем и свойством. Чисто с технической точки зрения ее нет (если property Name: string read FName write FName), но она как суслик - есть.

Под «залазит в код» я имел ввиду его изменение. Сторонний, очень условно, это ваш коллега, который использует, но не пишет, эту библиотеку
Вот это надо раскрыть… Что меняется для «коллеги, который пользуется библиотекой» при введении свойств?

Я понимаю манию на свойства в java/.net, там это объясняется тем, что библиотеки ORM или сериализации создают служебные прокси-классы — наследники ваших классов, и могут перекрыть геттеры/сеттеры, чтобы добавить нужное поведение (в java все методы по умолчанию виртальные). Но в Delphi-то зачем?
  1. В дельфи разве нет брекпоинта на изменение переменной или поля? Точно?

  2. и 3. Вы здесь противоречите самому себе. Если есть разница между полем и свойством - то и надо писать поля (закрытые или открытые) и только в НЕКОТОРЫХ случаях - свойства. Только когда нужно. А не писать единообразно и поля и свойства в виде пропертей. Нельзя "единообразно" писать, потому что да, между полем и свойством (и даже между приватным полем и публичным полей) - есть разница.

Так лишние строки из ниоткуда появляются, и какая от них польза, непонятно.

Вам за экономию строк платят? Нет? Тогда не стоит заниматься ерундой.

Мне нравится лаконичность. Чем меньше строк, тем проще читать и понимать код.
Вот когда понадобится перехватывать запись в Name, вот тогда и заменю его на property, а заранее то зачем?

Нет ни одной причины держать поле публичным кроме «прадед моего прадеда писал так». Нужно будет отлавливать запись — добавите в декларацию свойства сеттер вместо имени поля.

Тут вы расходитесь с автором статьи, который всегда хочет сеттер в явном виде, чтобы ставить туда брейкпоинты (кстати почему запись хочет ловить, а чтение не хочет, показывая в примере read FName write SetName?).

писать же
property Name: string read FName write FName;
не вижу никакой причины, кроме «прадед моего прадеда писал так»

кстати почему запись хочет ловить, а чтение не хочет

При отладке какого-нибудь бага нередко возникает ситуация, когда в свойстве оказывается какое-то неожиданное значение, и в попытке узнать откуда оно там берётся — ставится точка останова на сеттере свойства.

Прадеды так не писали, мне кажется. Тотальное закрытие полей и гетеросеттеризация - относительно новый тренд.

Да уже выросло поколение, у которых деды практиковали эти паттерны.

Начал читать. Протёр глаза. Проверил календарь. Декабрь 2022 года, точно. Но ощущение, что читаю пост с sql.ru откуда-то из 2002, никак не проходит. Такой древностью повеяло, что аж страшно.


Автор, батенька, вы напрочь сварились в собственном соку. За то время, пока вы (судя по тону, в основном в одно лицо) разрабатывали ваш продукт, индустрия ушла уже очень далеко.


Я и сам не то что бы молод, и если бы я продолжал разрабатывать свой первый относительно успешный продукт с 2001 года по сей день, вероятно, написал бы что-то в таком же духе. Но я с тех пор трижды поменял технологический стек, а предметную область и того больше раз. Было тяжко каждый раз, но зато не застрял в прошлом. (А относительно успешным продуктом пускай лучше занимается молодёжь, уже без моего участия.)


Да просто чтение чужого кода, написанного с новым синтаксическим сахарком в очередном модном молодёжном стиле, здорово поднимает уровень осознанности того, что ты делаешь. Особенно хорошо, если этот чужой код на каком-то новом для тебя языке с другими акцентами.


Не тащите на себе это вечное легаси, в нём не будет счастья.

Вам со стороны виднее, спорить не буду. По фактической стороне:

Нет, я пишу не один, совсем даже не один. Вот этот рефакторинг (только рефакторинг) делает аж цельных три человека. Просто на мне большая нагрузка, это да. А в целом, над продуктом работает несколько десятков человек, и это только разработчиков, не считая тестирования и прочего...

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

Не так всё однозначно.. Вы можете привести пример языка, который строит нативный exe в считанные секунды? Пишу в основном под десктоп, и это прям боль, ждать когда сборщик соизволит закончить работу. Что ява, что котлин, что qt, что электрон, все тормознутые донельзя. Плюс размер бинарников какой-то умопомрачительный.
А родная старая делфа - нажмёшь F9, пара секунд и форма на экране. Как же мне этого не хватает.

UFO just landed and posted this here
новый файл с классом из десяти строк

Это лучше, чем unit-братская могила на 10 000 строк, в которую напихано всё подряд.


Но при чём тут «паттерны»?
Если употребление паттерна улучшает качество кода, то его использование оправдано. А сколько там строк совершенно не важно.


По крайней мере у меня не зашли всякие там «Extract interface», ни в одной IDE, которой я пользовался.

Можно подумать, будто для Delphi много IDE.
Начните с «Extract Method», а там втянетесь.


Для меня самый удобный рефакторинг – Ctrl+R/Ctrl+H, Replace мощная штука, только регулярки я пишу со скрипом, ну никак они мне не даются.

Тупиковый путь, чреватый ошибками.


Говорят, у IntelliJ с рефакторингами хорошо

В IDEA он божественен.


У тебя не тестированная версия Delphi! Проверь каку!

Директиву $MESSAGE FATAL завезли ещё в каком-то дремучем году.
Нет никаких причин косплеить Turbo Pascal for DOS.


Result := Fields[I];
Exit;

Можно просто Exit(Fields[I]);

Про паттерны, я же не написал что не надо их использовать. Весь пост про умеренность.

Рефактоинги - я писал: пользуйтесь. У меня, лично, не зашло. Про Replace спорить не буду, сомнительный путь, но работает иногда.

Про MESSAGE FATAL не знал, спасибо!

Exit(Result) - это если у вас, семерки нет в списке совместимостей ;)

Зачем нужно публичные поля загонять в приватные и делать проперти-геттеры-сеттеры? Что это дает? Ну, кроме мусора, конечно? Какие тайные знания появляются, какой функционал у системы появляется? Проперти нужны, если при при присваивании имеются действия, которые необходимо выполнять при присваивании. Много у вас таких филдов в приложении? Прям все? В шарпе взяли моду, все абсолютно поля делать приватными и геттеросеттеры плодить. В джаве - хоть и можно делать публичные поля, но джава-общество принципиально не согласно не заниматься ахинеей. При этом эти бессмысленные и бесполезные геттеросеттеры настолько всех задолбали, что даже придумали ломбок, который сам делает геттеросеттеры. И к чему все вылилось? Фактически, все публичные поля, которые должны быть по-хорошему объявлены публик (и не париться), и являются публик, но через жопу - через ломбок.

Сплошное применение геттеросеттеров вредит структуре проекта. Нарушает явное разделение полей на закрытые от внешнего мира и открытые. Они все - приватные, но НЕКОТОРЫЕ - с геттерами и/или сеттерами. Вместо того, чтобы просто увидеть "публик", надо анализировать взглядом, есть у него геттеросеттеры или нет. Ладно, если ломбок есть, там по собаке можно определить. А если через обычные методы? Шариться по коду?

Чем мне нравился Дельфи - так это тем, что там можно было делать публичные поля, и там где надо - приватные. И вы тоже тащите в Дельфи всю эту гомосятину с гетеросеттерами. "Рефакторите" хороший прямой код. Фу.

Вот уж не думал, что тема свойств будет так обсуждаться. Проходная совершенно. Забавно.

Sign up to leave a comment.

Articles