|
|
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
На всякий случай: есть такой (возможно, спорный) критерий "грамотности" программы, работающей с БД: каждое действие пользователя, могущее изменить данные в БД, оформляется как отдельная форма с кнопками "Ок (Сохранить)" и "Отмена" При этом "единицей" редактируемых данных является "бизнес-сущность" (как правило, отдельный класс, имеющий методы "загрузить из БД по Id" и "сохранить в БД"), которому в БД может соответствовать что-то большее, чем одна записи в одной таблице (например, бизнес-сущность "Счет" или "Накладная" может состоять из 1 записи в таблицах счетов или накладных плюс несколько записей в таблицах строк счетов или строк накладных, т.е. пара таблиц Master/Detail со связью Foreign Key -> Primary Key) То есть, вся эта бизнес-сущность в процессе её редактирования 1) загружается из БД 2) меняется пользователем и 3) сохраняется, при этом доступ к этой же самой сущности других пользователей должен либо а) блокироваться по пессимистическому принципу, то есть второму пользователю, попытавшемуся открыть форму её редактирования, выдается сообщение "эта бизнес-сущность уже редактируется пользователем 1!", либо б) по оптимистическому принципу - открыть и редактировать сущность смогут несколько пользователей сразу, но во время попытки сохранения любым из пользователей отредактированной им сущности должна происходить проверка на совпадение текущего состояния сущности в БД и того состояния, в котором сущность была считана из БД данным пользователем и в случае несовпадения выдается сообщение типа "эту сущность уже отредактировал и сохранил другой пользователь!" (и тут второму пользователю придется либо отменить сделанные им изменения и перечитать бизнес-объект снова, либо перезаписать измененный первым пользователем бизнес-объект, проигнорировав внесенные им изменения. Этот выбор может второму пользователю и не даваться - в зависимости от его прав - то есть может действовать только вариант "всё отменить и перечитать бизнес-сущность") Простая и легко реализуемая альтернатива этому варианту - нет никаких кнопок "Сохранить/Отменить" и даже нет отдельных форм для редактирования бизнес-сущностей, а момент сохранения сделанных пользователем изменений в БД определяют сами элементы пользовательского интерфейса (controls, data-bounded). Можно ли им эту ответственную задачу поручить - решаете вы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2018, 19:16 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
Чингис, Просмотри темы по DDD (Domain Driven Design), паттерны (например Repository). Рекомендую так же статьи Nick Hodges для общего развития. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 07:35 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
Вот, еще из личного Как нельзя и как можно! 0. Нельзя черпать вдохновение на сайте http://govnokod.ru/pascal, но можно и нужно задуматься о своем месте в мироздании. Возможно в качестве дворника, или кондуктора Вы принесете больше пользы человечеству. 1. Не следует приступать к работе в бессознательном состоянии когда ваш мозг не может совершать элементарную мыслительную деятельность, лучше лечь и поспать еще. Вот характерный пример: Код: pascal 1. 2. 3. 4. 5. 6. Не нужно чистить только что созданный объект, а вот разрушать созданный локальный объект следует, при чем обязательно с использованием try finally. Помните сон разума рождает чудовищ. 2. Не забывайте, что парные процедуры BeginUpdate, EndUpdate, DisableControls, EnableControls и т. п. требуют try finally точно так же как и Create, Free Код: pascal 1. 2. 3. 4. 5. 6. Если не использовать EnableControls, в блоке finally, то любое исключение приведет к потере работоспособности формы и вероятно потребует перезагрузить приложение. Для простого пользователя это бóльшая проблема чем утечка памяти из-за того, что некоторый объект не был бы разрушен. 3. Не следует использовать оператор GOTO, откройте для себя такое понятие как структурное программирование . Требование может показаться очевидным, но тем не менее кто-то продолжает использовать этот оператор. 4.Не добавляйте и не оставляйте информацию, которая затрудняет анализ кода поиск нужной информации и массовое внесение изменений. Не оставляйте закомментированные участки кода, лишние пустые строки, неиспользуемые переменные, самоочевидные комментарии и пр. Если в рамках текущей задачи нет времени на более тщательную проверку, то хотя бы добавляйте понятный комментарий в формате DoTo. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Еще пример: Код: pascal 1. 2. Спасибо капитан Очевидность, мы знали, что если файл пустой, то в нем ни чего нет, хотелось бы знать какой файл, почему пустой, что в строке ниже удаляется... 5. Не смешивайте визуальное и не визуальное программирование. Например: если форма в файле dfm называется "Список клиентов", а где-то в коде оно меняется на "Список абонентов", то это несет дополнительные сложности, если нужно массово изменить все формы связанные с клиентами. Т.е. свойства которые необходимо изменять в коде должны меняться только в коде, а в dfm-файле должно быть установлено умолчательное значение. Тоже самое относится к тексту запросов и текстовым сообщениям. 6. Не используйте динамическое формирование запросов и макросы в запросах без крайней на то необходимости. Если запрос изменяется в коде, то невозможно его скопировать в сторонний редактор запросов и обратно. Требуется запускать приложение и мониторить все запросы. При этом нет гарантии, что вы пройдете по всем веткам программы и проверите все варианты запросов. Таким образом любое даже тривиальное изменение существенно усложняется. 7. Недопустимо чтобы после ваших изменений появлялись новые Hint`ы и Warning`и. Старые Hint`ы и Warning`и следует устранять, если они расположены около ваших изменений. 8. Нельзя бездумно обращаться к объектам внутри обработчика события. Что произойдет если это же событие будет присвоено другому объекту? Что будет если исходный объект кто-то скопипастит? Вот характерный пример: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Для грида gSearchResult был определен обработчик события по которому выполняется сортировка, в нем на прямую идет обращение к этому гриду и связанному с ним набору данных. Во-первых в будущем набор данных может поменяться, а в событии будет по прежнему сортироваться старый набор данных и ни кто этого не заметит. Во-вторых исходный грид вовсе не обязательно будет единственным. Он может быть скопирован вместе со всеми обработчиками событий (как и произошло в приведенном примере), но при клике по заголовку второго грида сортироваться будет набор данных из первого. Вариант исправления примерно такой: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Этот обработчик можно безопасно использовать в различных ситуациях. Можно было бы еще и переименовать его, чтобы было видно, что он не привязан к конкретному гриду. Такой подход не может рассматриваться как общее требование, потому, что в некоторых случаях логика работы требует обращения к какому-то конкретному объекту, таким образом требуется обдумывать решение в каждом конкретном случае. 9. Нельзя обращаться к объектам, которые могут быть пустыми. Нельзя выполнять приведение типов, если нет уверенности в совместимости типов. Проверяйте значения на допустимость в обработчиках событий! Например: Код: pascal 1. Очевидно, что DataSet может быть nil, DataSource может быть nil, Sender может быть не TBbsDBGridEh, т.е. в одной строке три потенциальных места для ошибки. Проверять можно как показано в предыдущем примере. В случае недопустимых, или пустых значений, в зависимости от логики работы можно либо ни чего не делать, либо поднимать исключение с человеческим текстом. 10. Не следует освобождать не инициализированные объекты. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Что будет, если ошибка возникнет в конструкторе? Clipboard будет содержать мусор, мы попытаемся обратится к этому объекту в разделе finaly, и получим другую ошибку, а информацию о первой ошибке потеряем. Что будет, если ошибка произойдет в ClipBoard.Close? Мы не уничтожим объект и получим утечку памяти. Вариант исправления: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Если в конструкторе произойдет ошибка, то в раздел finally мы не попадем. Общий шаблон использования объектов такой: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. или Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Не следует вызывать один пользовательский обработчик события из другого события. Например: Код: pascal 1. 2. 3. 4. 5. 6. Здесь по нажатию Ctrl+C происходит вызов обработчика двойного клика, который копирует данные в буфер обмена. Из названия gSearchResultDblClick ни как не следует, что обработчик этого события должен что-то скопировать в буфер обмена. Вполне возможно, в будущем к двойному клику будет привязана другая более стандартная функциональность, при этом и обработчик Ctrl+C перестанет работать. Лучше вынести код gSearchResultDblClick в отдельный метод и во всех обработчиках событий вызывать этот метод. А еще лучше создать действие (Action), и обрабатывать нажатия клавиш используя возможности Delphi, вместо того, чтобы изобретать свой собственный велосипед. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 12. Ни когда не освобождайте объект внутри метода этого объекта в Delphi это недопустимо. Также недопустимо уничтожение объекта внутри обработчика события, объекта, т.к. обработчики событий вызываются из методов объекта. Например нельзя уничтожать форму в обработчике события OnClose этой формы: Код: pascal 1. 2. 3. 4. 5. Здесь можно присвоить параметру Action значение caFree, но лучше всегда использовать стандартный шаблон работы с модальной формой Create-ShowModal-Free. 13. Не используйте вложенные with, не используйте большие блоки кода внутри with. Например: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Надо сказать, что большие методы и блоки кода сами по себе затрудняют анализ кода и обычно являются дурным тоном а также признаком низкого профессионализма. Использование же with особенно сильно запутывает логику работы программы, при этом не позволяют использовать переход по ctrl+click и не позволяют видеть значения переменных в процессе отладки. Поэтому надо всегда избегать использования оператора with за исключением очень коротких и очевидных методов. Лучше вообще ни когда его не использовать. 14. Не используйте Free для глобальных переменных и полей Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Здесь при первом вызове, объект frmEditPayDoc равен nil, затем он создается и разрушается. После Free переменная frmEditPayDoc содержит ссылку на разрушенный объект но не nil. Таким образом при повторном вызове будет обращение к разрушенному объекту и ошибка доступа к памяти. В исходном коде ошибка маскировалась большим количеством дублированного кода, который в примере не показан. Чтобы избежать таких ошибок используйте глобальный стандартный метод FreeAndNil, который разрушает объект и обнуляет значение переменной. 15. Избегайте дублирования кода, ибо "копипаст" — зло. См. пример из п. 14. Единственная разница в блоках if/else это создание объекта, если он был пустым. Таким образом очень легко переписать условие следующим образом: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Но гораздо быстрее сразу писать без дублирования кода, чем потом пытаться найти отличия в двух ветках условия. Вот еще характерный пример: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. За длиннющим текстом "qSomeFriendlyQueryName.FieldByName('Some_Friendly_Field_Name').Value" теряется ясность понимания кода и что вообще предполагается сделать. Хотя если была цель сломать мозг своему коллеге, то стиль выбран правильно. 16. Не оставляйте Hint и Warning. Warning рекомендуется интерпретировать как ошибки компиляции. Код: pascal 1. 2. 3. 4. 5. Здесь было предупреждение о том, что переменная SumByBalances может быть не инициализирована, но из-за того, что в проекте огромное количество предупреждений на это ни кто не обращал внимание. Код: pascal 1. 2. 3. 4. 5. 6. Ошибка довольно серьезная, перед выполнением цикла значение суммы может содержать любое значение, но с большой вероятностью оно будет содержать 0, таким образом на этапе тестирования ошибка не будет замечена, однако при длительной работе там может содержаться любое значение и кто-то попадет на "лавэ" без каких-либо предупреждений (в 90-х за это отправляли раков кормить). 17. Не используйте стандартные свойства компонентов для хранения переменных. Весьма вероятно, что кто-нибудь их изменит, что сломает всю логику работы приложения. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Здесь видно, что обработчик события aAnnulPayUpdate использует то значение N9.Enabled, которое сам же меняет. Это происходит не явно, и ошибку трудно найти. Можно просто добавить свойство с удобочитаемым названием и использовать его. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Одна строчка написанного кода исключила бы ошибку и сделала бы код более ясным. 18. Не сравнивайте результат окна диалога с неумолчательным значением (обычно mrNo). Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Что будет, если кто-то добавит третью кнопку mbCancel? Что будет если пользователь нажмет крестик в верхнем правом углу? Действие будет выполнено, что неожиданно и не правильно. Можно конечно сделать крестик недоступным и надеяться, что ни кто не добавить кнопку Cancel, но лучше переписать условия так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Общий шаблон для создания условий выглядит так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 19. Не используйте преобразования в строку и обратно без необходимости (в особенности это относится к датам). Во-первых это долгая операция, во-вторых увеличивает вероятность ошибок связанных с различиями в региональных настройках. Код: pascal 1. 2. 3. 4. 5. 6. Тип TDateTime это обычное число с плавающей точкой (Double), в целой части хранятся сутки (количество дней прошедших с 30.12.1899), в дробной части хранится время. Для получения целой и дробной части числа можно использовать например функции Trunc и Frac. Код: pascal 1. 2. 3. 4. 5. 6. 7. Еще характерный пример. Код: pascal 1. 2. 3. 4. Здесь трудно с уверенностью сказать, какие мысли были в голове у автора, скорее всего см. п. 1, однако допустим, что автор хотел округлить дату и время до целых долей секунды. В реальности происходит преобразование даты и времени в строку в строго фиксированном формате, а обратно происходит преобразование из строки формат который указан в региональных настройках компьютера, что приводит к ошибке. Есть много вариантов округления, например такой: Код: pascal 1. 2. 3. 4. 5. 6. Полезными могут оказаться также функция Math.RoundTo и константы HoursPerDay, MinsPerDay, SecsPerDay, MSecsPerDay. 20. Ни когда не устанавливайте свойство формы Position в значение poDesktopCenter. Это означает, что форма будет расположена посередине рабочего стола, который представляет из себя прямоугольник охватывающий координаты всех имеющихся мониторов. При наличие двух мониторов форма будет расположена между ними, это неожиданно и не правильно, используйте значение Position = poScreenCenter. 21. Не следует забывать, что в выпадающем списке может быть выбрано недопустимое значение с ItemIndex = -1. Код: pascal 1. Здесь в некоторых случаях будет ошибка. Которую трудно обнаружить на этапе тестирования. 22. Если изменяемое свойство некоторого объекта это другой объект, то нельзя просто ограничиться присваиванием ссылки. Код: pascal 1. Представим себе, что сначала присвоили некоторое значение, а потом удалили экземпляр объекта TSession. Получается, что поле FSession содержит не пустую ссылку на несуществующий объект. Обращение по такой ссылке приведет к ошибке при этом ни как не возможно проконтролировать допустимость обращения. Вот работающий шаблон: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Теперь если экземпляр объекта будет удален, то поле FSession будет содержать значение nil. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:42 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
Скушно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 12:13 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
roschinspbВот, еще из личного В целом толково. автор2. Не забывайте, что парные процедуры BeginUpdate, EndUpdate, DisableControls, EnableControls и т. п. требуют try finally точно так же как и Create, Free Для новичков - верно, а более продвинутые могут предварительно оценить, вероятно ли исключение между действиями. Например, заключать в try-finally I:=I+1 будет нелепо. Но имеет смысл только для таких простейших действий либо если совсем критична производительность, и блок сильно замедляет. автор3. Не следует использовать оператор GOTO, откройте для себя такое понятие как структурное программирование. Требование может показаться очевидным, но тем не менее кто-то продолжает использовать этот оператор. Опять же для новичков разумно, в более сложных случаях иногда goto пригождается. Например, выход из цикла большой вложенности либо прыжок на блок обработки из нескольких исходных мест, когда производительность критична и вложенная подпрограмма не вариант. Правда, последнее становится менее актуальным с появлением inline. автор6. Не используйте динамическое формирование запросов и макросы в запросах без крайней на то необходимости. А вот это в более-менее серьезном проекте почти неосуществимо. Добавлю в тему: - Не хранить тексты запросов в свойствах компонентов - dfm файлы часто исключены из фильтра поиска, и в случае чего искать текст придется долго. Я в одном проекте (всё на ХП, запросов немного) выделил все тексты в секцию констант одного юнита, а в другом (клиентский софт для БД с кучей таблиц) задаю их константами внутри методов, но обязательно добавляю к имени суффикс SQL, чтобы облегчить поиск в случае чего. - (более всеобъемлющий вариант) вообще по максимуму ограничить задание в дизайн-тайм db-aware компонент. С установкой свойств в коде удобнее обращаться, и она более наглядна. авторТип TDateTime это обычное число с плавающей точкой (Double), в целой части хранятся сутки (количество дней прошедших с 30.12.1899), в дробной части хранится время. Для получения целой и дробной части числа можно использовать например функции Trunc и Frac. Не стоит. Это протекание абстракции, плюс если вдруг гипотетически TDateTime изменится с Double на, к примеру, record, такие упрощения будет больно вспоминать. К тому же они затрудняют разбор исходников тем, кто не знаком с устройством типа даты-времени. Рекомендую совсем забыть о внутреннем устройстве TDateTime и работать с ним исключительно через функции. Вместо Trunc и Frac есть DateOf и TimeOf. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 11:13 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
скачать небольшуюНа всякий случай: есть такой (возможно, спорный) критерий "грамотности" программы, работающей с БД: каждое действие пользователя, могущее изменить данные в БД, оформляется как отдельная форма с кнопками "Ок (Сохранить)" и "Отмена" Это похоже на критерий грамотно решённой контрольной по математике: каждая задача оформлена на отдельном листочке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 12:15 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
Василий 2Добавлю в тему: - Не хранить тексты запросов в свойствах компонентов .... задаю их константами внутри методов, .... Замечательный пример стратегии "в гамаке и стоя". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 12:16 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
Марксизм не догма, а руководство к действию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 13:43 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
softwarerВасилий 2Добавлю в тему: - Не хранить тексты запросов в свойствах компонентов .... задаю их константами внутри методов, .... Замечательный пример стратегии "в гамаке и стоя". Обоснуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 14:26 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
Хранить запросы к базе нужно в самой базе. Если нет механизма ХранимыхПроцедур, то выделите табличку для запросов. Причина ? Для изменения запроса не придётся компилять программу и раздавать всем пользователям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 14:50 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
DimaBrХранить запросы к базе нужно в самой базе. Если нет механизма ХранимыхПроцедур, то выделите табличку для запросов. Причина ? Для изменения запроса не придётся компилять программу и раздавать всем пользователям. Для выполнения запроса тогда нужно будет сначала его достать из БД, потом выполнить и отдать пользователю результат - дополнительное действие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:06 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
DimaBr, Нечастый случай: Запрос меняется, а самой программе изменения не требуются... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:06 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
zinpub Нечастый случай: Запрос меняется, а самой программе изменения не требуются... Ну это как раз не проблема - есть у меня проект, где почти весь интерфейс пользователя (ввод параметров, отображение и т.п.) строится в динамике, а бизнес-логика живет в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:10 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
DarkMasterzinpubНечастый случай: Запрос меняется, а самой программе изменения не требуются... Ну это как раз не проблема - есть у меня проект, где почти весь интерфейс пользователя (ввод параметров, отображение и т.п.) строится в динамике, а бизнес-логика живет в БД. Согласен - если выносится в БД и интерфейс и логика. А вот что-то одно... Одна нога здесь, вторая в Чикаго. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:18 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
Василий 2Обоснуй Подход подразумевает невозможность открыть датасет в дизайн-тайме. Следовательно, многие возможности отладки и настройки в дизайн-тайме тоже недоступны, плодится куча тупейшего кода, для отлова тривиальных ситуаций типа "поле на десять пикселей уже, чем значение" или там "опечатка в названии поля" требуется запуск программы, а для проверки исправления - ещё один запуск. Итого медленная неэффективная разработка и тупой код в результате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:20 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
zinpubDarkMasterпропущено... Ну это как раз не проблема - есть у меня проект, где почти весь интерфейс пользователя (ввод параметров, отображение и т.п.) строится в динамике, а бизнес-логика живет в БД. Согласен - если выносится в БД и интерфейс и логика. А вот что-то одно... Одна нога здесь, вторая в Чикаго. :-) Если в базе хранится и интерфейс и логика, то зачем тогда приложение ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:23 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
schizinpubпропущено... Согласен - если выносится в БД и интерфейс и логика. А вот что-то одно... Одна нога здесь, вторая в Чикаго. :-) Если в базе хранится и интерфейс и логика, то зачем тогда приложение ? Чтобы с базой работать не на уровне sql запросов. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:25 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
schiЕсли в базе хранится и интерфейс и логика, то зачем тогда приложение ? Есть определённый набор методологий, которые я называю "однозвенное мышление". Они объединены тем, что практически вся логика проекта вынесена на какое-либо одно звено, а остальные выполняют чисто декоративные и технические функции. Как правило, так происходит потому, что человек, выполнявший роль архитектора, по своему профессиональному опыту и компетенциям тяготел именно к этому звену, ну а там... если в руках молоток, все проблемы выглядят похожими на гвозди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:26 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
schi, Не "хранится", а "строится" :) Разницу чувствуешь?-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:27 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
DarkMasterДля выполнения запроса тогда нужно будет сначала его достать из БД, потом выполнить и отдать пользователю результат - дополнительное действие. Запросы читаются пакетом при старте программы. Это очень быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:39 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
DimaBrDarkMasterДля выполнения запроса тогда нужно будет сначала его достать из БД, потом выполнить и отдать пользователю результат - дополнительное действие. Запросы читаются пакетом при старте программы. Это очень быстро. Потом запрос в БД меняется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:44 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
Запрос для бд - хранить в БД. А запрос на запрос - тоже в БД. ;) Рекурсия! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:51 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
DimaBr, авторДля изменения запроса не придётся компилять программу и раздавать всем пользователям. База, конечно же, чудесным образом поменяется :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:52 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
rgreatЗапрос для бд - хранить в БД. А запрос на запрос - тоже в БД. ;) Рекурсия! Запрос на Запросы - это select * from ТаблицаЗапросов. Что тут менять ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:54 |
|
||
|
Грамотно написать программу а не говнокод
|
|||
|---|---|---|---|
|
#18+
makhaonБаза, конечно же, чудесным образом поменяется :) Разве кто-то говорил что не нужно ничего менять ? Поменять запрос в базе и перекомпилять программу это несоизмеримо. В первом случае для пользователя ничего не измениться, он даже этого не заметит, во втором случае неизбежное обновление программы у всех пользовалелей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 15:56 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39628469&tid=2040998]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
236ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 574ms |

| 0 / 0 |
