Pull to refresh
-1
0.4
Send message

Вот почему так-же нет в Java?! Один файл подправил - две трети файлов в проекте перекомпилируются.

Когда джентльмены проигрывают в игре, джентльмены меняют правила.

А если серьезно, в США закон имеет обратную силу? Непонятно, что он такого сделал, чего не делали другие? Так-то, он боролся со спуфингом. Или зарабатывать могут только обитатели Уолл-стрита, а обитатели Лондона имеют право только проигрывать? И он подданный королевы, на каком основании его американское "правосудие" взяло? Грустная история, конечно.

Насколько я понимаю, канареечные релизы можно применять для фич типа интерфейса или вывода какой-то информации. Но как можно выкатывать изменения в бизнес-логике для части пользователей? У одних пользователей счета формируются одним образом, а у других - по-другому? А они не бегают с изумленными воплями, почему у одних система работает одним образом, а у других - по-другому?

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

Но явно не телевизоры.

Бистро погуглил. Честно говоря, не понял, в чем проблема. У лазеров есть программа управления? Думаю есть. Рисуете рисунок в Компасе, сохраняете в в dwg, загружаете штатной прогой лазера и режете.

Насколько я понял, основная фича lightburn - это редактирование рисунка и управление лазером. Рисунок рисуете в Компасе, лазером управляете из проги в комплекте лазера.

Не спец, хотелось бы узнать - есть аналогичный функционал у "Компас" (у плагинов для него) или его аналогов? Что это вообще за тема? Насколько сложно написать плагин для Компаса, чтобы рисунок в команды для лазеркаттера (это ведь софт для лазеркаттера?) переводил?

Простите, что?!! Вы отсылали свои генетические данные каким-то сайтам за рубеж? Это не запрещено у нас?

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

SOLID негативно относится к наследованию, и я этим совершенно согласен.

  1. Выделение общего функционала следует делать не через выделение в parent, а через выделение в отдельный класс со своим интерфейсом. Spring этим и занимается.

  2. Добавление функционала следует не через добавление наследника, а через композицию - выделение функционала в отдельный класс и либо иньекцией в наш класс, который будет это использовать, либо (что лучше, но надо смотреть), в окружение, которое вызывает наш класс и будет следом вызывать класс с дополнительным функционалом. Этим тоже занимается Spring.

На каждую новую фичу jar не будет, но новый class-файл - да, будет.

Без понятия. Интуиция, взращенная чтением классической русской литературы.

Спасибо большое, обязательно почитаю!

Все верно. Если надо добавить функционал в модуль, то мы текущий модуль не меняем, но делаем новый модуль, куда реализуем расширение, а переключение должно осуществляться в вызываемой программе. То есть, это не модуль должен знать, куда ему к примеру, выводить информацию, какая структура окружающего кода, а вызываемая система знает, какой интерфейс у исходного модуля и какой новый модуль нужно написать для расширенного функционала.

Текущие модули мы не меняем, а для нового функционала пишем новые модули.

Пример. Есть система. Есть модуль, который делает расчет. Расчет возвращается в окружающую его систему. Понадобилось, чтобы расчет форматировался определенным образом.

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

Правильно: мы пишем новый модуль, который будет заниматься форматированием. Может, даже несколько модулей с одним и тем-же интерфейсом, но для html, json и так далее. Проводим в окружающей системе изменения для вызова форматирования результатов после выполнения расчета.

Если нужно расширить, чтобы система делала кроме расчета А еще и расчет Б, мы не меняем модуль с расчетом (который был только А, а мы даже не подозревали, что будет еще Б), а делаем еще один модуль с расчетом Б, а в вызывающей системе делаем switch и вызов (ну или применяем ООП).

SOLID (сокр. от англ. single responsibilityopen–closedLiskov substitutioninterface segregation и dependency inversion) в программировании — мнемонический акроним, введённый Майклом Фэзерсом (Michael Feathers) для первых пяти принципов, названных Робертом Мартином[1][2] в начале 2000-х[3], которые означали 5 основных принципов объектно-ориентированных проектирования и программирования.

Это цитата из Вики.

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

SOLID - это формализованные непонятно кем идеи Дяди Боба. Формализованные и превращенные в догмы, криво и (имхо) неправильно.

Я лично не мог понять их смысл, душа противилась. Потом я прочитал книги Дяди Боба и мне все стало понятно. В том смысле, что стало понятно, что имел в виду Дядя Боб.

Не надо изучать SOLID. Читайте Дядю Боба. У него все понятно, логично, красиво и правильно. В частности, только после его книг мне стал понятен смысл и сила Spring.

У меня в практике - постоянно. Не знаю, как в других шарагах, может, большинство вообще без проектов работают и пишут стопроцентрую отсебятину, но я сомневаюсь, что в Яндексе или Сбере пишут без проекта. Особенно в банковской сфере.

Я не согласен с автором, что программисты создают очень некрасивые и "запутанные" условия в if.

На самом деле, такие условия могут быть описаны в проекте и диктоваться бизнесом. И (я считаю), разработчик должен реализовать такие условия (ОСОБЕННО условия) один-в-один, как проекте.

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

Имхо: код должен однозначно соответствовать по логике проекту и требованиям бизнеса. Особенно условия.

Второе возражение на isDisabled. isDisableb поле может определяться из поля базы какой-то таблицы. Таблица и поля диктуются логикой бизнеса, то есть, ты не можешь переименовать по своему хотению имена полей. Соответственно, и поле класса ты обязан называть isDisabled. И даже делать костыль-метод isEnabled ты не имеешь права. По причине того, что последующие разрабы при дебаге, при попытке выяснить, где используется поле isDisabled, не смогут его найти и будут долго распутывать ваши "упрощения" и "оптимизации".

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

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

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

Кстати, почему автор не написал эту ловушку, очень часто присутствующую на практике, я не понимаю. "Реализуй код, максимально не совпадающим с описанием в проекте. Пусть условные выражения делают то, что требуется в проекте, но максимально отличным от проекта. Оптимизируй все, что можно. Пусть последующие разработчики при дебаге, имея проект на руках, сравнивали твой код и условия в проекте максимально долго и мучительно. Такую бомбу ревьюверы никогда не видят и не могут увидеть, потому что никто не сравнивает код с проектом, а даже если бы и увидели, то всегда можно сказать, что ты оптимизировал выражение и упростил код."

Возможно, я пропустил, но не вижу уникального индекса balance_id, ref_id на таблице _balance_amount

Случайности не случайны. В нашем мире жестко прописан закон сохранения энергии. Энергия не может случайно появиться. Все, все абсолютно - только преобразование энергии. А тут хлобысь - и вдруг ниоткуда появилось энергии в таком количестве, что хватает на формирование всего, что есть в нашей вселенной - мириады и мириады галактик и скоплений галактик.

Information

Rating
2,115-th
Registered
Activity

Specialization

Specialist
Java
Oracle
SQL
Git
Spring Boot
Apache Maven
REST
Database