Pull to refresh

Comments 22

«Дело мастера боится» — русская народная поговорка.

Заказчику повезло с Team Lead-ом.
Им найден способ как практически бескровно начать «апгрейдить» текущее ИТ-решение.

Правда, этот подвиг скорей всего останется не замеченным Заказчиком, но я вот для себя добавил Александра в «избранных» хабрачан, если мне или кому-то из моих друзей понадобится Мастер.
Приятно слышать такую оценку)
Да, может заказчик никогда и не узнает, но он где-то далеко. Я больше стараюсь думать о людях которые вокруг меня и совершать маленькие подвиги для них)
Просто замену прошло не больше 2% фич проекта, я надеюсь я когда-нибудь напишу материал, какой кровью обошлась полная замена таким методом)
Сколько вас ждет усилий и времени я могу представить, у нас самих ушло несколько лет на то, чтобы переработать ИТ-решение. Дело ли мы это совмещая «апгрейд» старых фич и создавая новые, без открытия специальных проектов рефакторинга под это.

Тоже написал статью про наш «legacy» проект на днях.
Так как был руководителем проектов, то начали раскручивать клубок через технические задания. Приводя в порядок их и те куски, что им соответствовали внутри.

В нашем случае Проблема выглядела так, когда мы делали что-то одно, у нас отваливалось в нескольких других местах. У Заказчика сложилось впечатление что «Нормально» сделать с первого раза мы ничего не можем. Причина её заключалась «в сплошном коде», в котором было непонятно где заканчивается одна фича и начинается новая, и задача была разметить его на «функциональные области».

UPD. «Сплошной код» это была не вина Разработчиков, так как система изначально была коробочной и для настройки, а не для того чтобы на её основе разрабатывать отраслевое ИТ-решение.

Прошу простить мой технический русский, не разработчик, это мой обывательский взгляд РП-БА на ИТ-систему.
UFO just landed and posted this here
представьте 100K строк кода в старой версии контур-экстрена на сишарп с первым билдом в 1998

Не могу себе представить C# в 1998 году. Посмотрел историю вопроса на википедии: Проект C# был начат в декабре 1998 и получил кодовое название COOL (C-style Object Oriented Language). Версия 1.0 была анонсирована вместе с платформой .NET в июне 2000 года, тогда же появилась и первая общедоступная бета-версия; C# 1.0 окончательно вышел вместе с Microsoft Visual Studio .NET в феврале 2002 года.
UFO just landed and posted this here
UFO just landed and posted this here
С enum, можно было проще поступить. Нужно было просто добавить свой тип.
С order проблема тоже решается просто:
/**
 * @ORM\Column(name="`order`", type="integer")
 */
private $order;

Просто обрамляем апострофами

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


Про заказы, да, ваш способ работает, если вам нужен номер заказа, а нам нужен объект заказа, и вот такой способ не работает:


    /**
     * @ORM\ManyToOne(targetEntity="Orders")
     * @ORM\JoinColumn(name="`order`", referencedColumnName="id")
     */
    private $order;
Хм, странно, только что попробовал, все нормально работает. И механизм миграций отработал как надо, и запросы, которые через QueryBuilder, не развались.
/**
 * @ORM\Entity()
 * @ORM\Table(name="`order`")
 */


Возможно, Ваша проблема решилась апострофами в имени таблицы, если дело не в поле

Вот этот вариант сработал, только проблема, что данные в базу попадают, а когда выбираешь, поле order = null. Надо смотреть, что происходит в гидраторе. А у вас какая версия симфонии и доктрины (orm и dbal)?

Вообщем дебаг показал, что на 2.4.8 (это наша текущая версия), такой вариант не подходит, дело в этой строчке: https://github.com/doctrine/doctrine2/blob/v2.4.8/lib/Doctrine/ORM/UnitOfWork.php#L2624


Он показывает такие значения и не грузит объект


$data[$srcColumn] = null
$srcColumn = "order"
$data['order'] = null
$data['`order`'] = 3442
Версия доктрины у меня точно такая же, как и у Вас. Чтобы все работало, вы должны оставить апострофы в
 * @ORM\Table(name="`order`")

и убрать их в
     * @ORM\JoinColumn(name="order", referencedColumnName="id")

На офф сайте доктрины можно узнать, что по умолчанию экранирование полей используемых для джоинов игнорируется. Поэтому у вас поле `order` интерпритируется неверно (с апострофами). Прежде чем написать, я проверил это локально.

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


$entity->setOrder(null);

Приводит к ошибке: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order = NULL WHERE id = 41771' at line 1

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

Было бы интересно узнать, если кто-то разрулил и такой кейс более изящно

image


Я обновил блок про решение проблемы, мы через пару дней нашли способ оставив связь обойти эту ошибку. Мы погрузились в недры доктрины, и реализовали новый хак, который работает на более глубоком уровне и чуть более изящный, чем первый вариант на уровне объекта. Спасибо за ваши комментарии, они нам реально помогли.

> класс 2.000+ строк
Это не много. Это вполне себе такая средняя (толстая) entity в какой-нибудь ММО. Типа игрока или торговца.
А в банковском деле это даже не java-транзакция.

Всё зависит от того, что это за 2000+ строк.


Если это нормально побитый на методы класс + куча каких-нибудь геттеров/сеттеров, то и ладно (хоть и многовато на мой вкус, но читабельно).


Но реальность такова, что чаще всего в легаси-проектах в этих 2000+ строках полтора метода, которые занимаются всем и дёргают всё возможное (и SQL через heredoc, и строковые подстановки вместо шаблонов, и глобальные переменные/синглтоны/реестры, и т.д). Такое разбирать и поддерживать действительно сложно.

Самое интересное начнётся когда заказчик захочет улучшить старую функциональность, но это улучшение будет затрагивать и новую. Придётся принимать решение или дублировать, или переписывать старую на новом стеке. И то, и другое может заметно увеличить срок реализации минорной вроде бы фичи.
Sign up to leave a comment.

Articles