powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Эффективность, читабельность, сопровождаемость SQL кода
25 сообщений из 29, страница 1 из 2
Эффективность, читабельность, сопровождаемость SQL кода
    #39997727
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема для многих личная, заведомо субъективная, поэтому давайте больше примеров хорошего кода, не более 20 строк.
Если очень хочется покритиковать код опубликованный другими участниками, то критикуйте конструктивно - указав недостатки и переделав код так, как считаете правильно.

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

Я начну с кусочка кода, который написал вчера для иллюстрации моего метода проверки параметров запроса:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- опубликовано на правах GPL v3 / published under GPL v3
-- Автор/Author: НеофитSQL
--
-- инлайн квери precheck перечисляет через "или" все условия, при которых исполнение
-- квери следует прекратить и выдать сообщение об ошибке
-- глобальная функция fAbortQuery оборачивает процедуру Raise_Application_Error,
-- т.к. вызов процедур не разрешен из SQL select
with precheck as (select besapi.fAbortQuery('precheck failed in test.sql') from dual
                   where sysdate < to_date('2020','yyyy') or
                         sysdate > to_date('2037','yyyy'))

-- первая строчка задает имена и типы колонок, но не входит в рекордсет
-- если precheck условия выполнились. Если prechek выстрелил, квери вылетит с ошибкой
          select '?' as Question,      0 as Answer from dual where (select * from precheck)='as'
union all select '2x2=?',              4           from dual
union all select 'Сломаных индексов:', count(*)    from USER_INDEXES where upper(status) != 'VALID'
union all select 'Всего таблиц:',      count(*)    from ALL_OBJECTS where upper(object_type) = 'TABLE'



Кто-то прокомментировал, что не хотели бы сопровождать такой код. Как его сделать лучше?
Запрос достаточно простой - он выдает таблицу из двух колонок (текст, число) разных полезных значений,
предварительно проверив входные параметры, чтоб не генерить белиберду или пустую таблицу при плохих исходных.

Я знаю об одном недостатке этого кода - порядок строчек оставлен на произвол БД, удобного ключа сортировки нет.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997757
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

SQL и "не более 20 строк" - это оксюморон.

Кроме того, слепящие глаз "вершины SQL" хорошо бы показывать в привязке к возможностям версии конкретной версии системы.
Современные версии позволяют не выполнять клиентский запрос и другими способами, и без выброса сообщений об ошибках,
а "универсальный" SQL существует только в книжках сомнительной полезности.

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

Может быть, это сообщение для себя самого, такого сорта:
"Если вы видите этот текст, значит программист ошибся. Сообщите в службу поддержки."
?

Вот вам восторг без желчи - зашибись.
Вот вам конструктивная критика:
Надо всегда оставлять существо дело - когда код пишется, чтобы его комментировать столь общирно,
разумно выбросить сам код и оставить главное - комментарий, расширив его, при необходимости, до 20 строк.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997775
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Есть много других тем для желчи.
Никакой жидкости. Просто сферический говнокод останется говнокодом как его не "вылизывай".
Решать нужно бизнес задачи и в комплексе, а не высосанные из пальца "я защищаюсь от "плохих" параметров".
Если результатом твоей работы является запросишко, то ты просто мелкий sql-раб, мнящий о себе невесть что.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997780
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby
НеофитSQL,
Может быть, это сообщение для себя самого, такого сорта:
"Если вы видите этот текст, значит программист ошибся. Сообщите в службу поддержки."
?


Да, именно так.
На ситуации, где правильность и целостность системы под вопросом, желательно реагировать немедленно.

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

Это может измениться когда код над моим запросом изменится, мой код запроса целиком скопипастят в другую часть системы, или превратят в подчиненный запрос другого запроса, который шлет мусор.

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

Проверка параметров, это выбор каждого. Мои функции в сях проверяют указатели на читаемость/писаемость памяти, как это делают все системные функции Windows начиная с 2003. Это правильный уровень защиты для опубликованного API, но может казаться "слишком" для внутреннего использования. Зато если процесс крэшнулся, это никогда не в моей DLL.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997786
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLВ моем случае, сообщение "звоните поддержке" скорее всего увидит программист который дал
моему запросу плохой параметр, даже при самом примитивном тестировании. Это отличается от
случая когда он запустил мой запрос, увидел что-то на экране, и решил что все в порядке.

А как это может случиться если у тебя весь код обвешан юнит-тестами и данные, возвращаемые
запросом проверяются на соответствие заданным автоматически, без "увидел что-то на экране"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997796
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

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

А как это может случиться если у тебя весь код обвешан юнит-тестами и данные, возвращаемые
запросом проверяются на соответствие заданным автоматически, без "увидел что-то на экране"?


Очень просто, подумай: Мои юнит тесты проверяют мой код, и находят ошибки в моем коде.

Мусорные параметеры приходят от других, которых мои юнит тесты не проверяют.

Ты же знаешь, что такое юнит тест, или просто поторопился сделать комментарий?
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997804
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
...
В моем случае, сообщение "звоните поддержке" скорее всего увидит программист который дал моему запросу плохой параметр, даже при самом примитивном тестировании. Это отличается от случая когда он запустил мой запрос, увидел что-то на экране, и решил что все в порядке.
....


О, да ты великолепен!
То есть ты не свои ошибки таким образом проявлять собрался, а обучать других программистов,
как пользоваться твоими запросами, собираешься...
Это пять баллов.

Но попробуй принять в расчёт, что дела с тобой иметь никто не будет .

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

При таких задатках тебе бы не стоило заниматься такой фигнёй, как написание sql-запросов.
Садись сразу пиши корпоративные правила оформления кода и протоколы взаимодействия программистов.
Жалко такой талант на ерунду разменивать.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997864
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Понижайте градус агрессии, пока совсем в оскорбления не свалились...
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997877
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Проверку параметров оставь прикладному уровню; запанибратством с терминологией можешь блеснуть в прямом общении с коллегами, но документируя код, делай это не на смеси английского с придурковатым.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997881
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby

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


Конечно, для этого и пишется техническая документация, чтоб обучать других программистов.
Так учили меня, и так я учил других, когда это было моей работой.

booby

При таких задатках тебе бы не стоило заниматься такой фигнёй, как написание sql-запросов.
Садись сразу пиши корпоративные правила оформления кода и протоколы взаимодействия программистов.
Жалко такой талант на ерунду разменивать.


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

Тема про образование других программистов поднята хорошая, даже если тон выбран неудачно.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997886
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

опубликовано на правах GPL v3 / published under GPL v3
Инлайн, квери....

Тьфу, кровь из глаз.
Правильный код комментирует себя сам.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997887
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Сейчас я приношу некоторую пользу написанием SQL запросов
Какая может быть польза от тебя в SQL, если в банальный to_number ты передаёшь нецифровые символы и лезешь на форум за решением этой мега-проблемы??
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997897
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-код с удобными включателями/выключателями/переключателями (которые управляются комментариями или параметрами) нужен только в сугубо утилитарных скриптах для конкретной задачи, за ее пределами он никому не нужен.
А в рабочих задачах "производительность" с разгромным счетом побеждает "гибкость" и универсальные запросы не нужны.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997906
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вообще, скоро появятся макросы...
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997931
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И тогда наступит настоящий ад
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997932
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вячеслав Любомудров,

А я, как оптимист, надеюсь, что (как минимум скалярные) макросы дадут существенный прирост производительности
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997935
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Количество переключений контекста должно существенно снизиться, прозрачность повыситься, только хз как тюнить потом такие запросы... Надо как-нибудь на досуге покопать, но скорее всего реальные запросы можно будет видеть и у них будут свои sql_id
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39997943
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
booby

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

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


Мда, запущенный случай. Похоже, уже не операбельный.

Ладно, раз тема про комментарии попробуем так зайти:
вот здесь https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1329011&msg=22194853
для обоснования красоты твоего, перенесенного в этот топик, запроса ты используешь аналогию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// функция подсчета объема ведер и бутылок
ERRORCODE CalcVesselVolume( const OBJECT& po ) // вызов по ссылке не даст передать NULL
{
    if( o.type != TYPE_BUCKET && 
        o.type != TYPE_BOTTLE )
        return ERROR_BAD_OBJECT_TYPE;
   ...



Этот конкретный пример был предельно неудачен именно по причине того,
что в нём не используется Raise_Application_Error.
Он не аналогичен показанному в первом посте этого топика запросу.

Поэтому что возмьём за пример аналогии такой текст:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// функция подсчета объема ведер и бутылок
   void CalcVesselVolume( const OBJECT& po ) // вызов по ссылке не даст передать NULL
{
    if( o.type != TYPE_BUCKET && 
        o.type != TYPE_BOTTLE )
        Throw( Ex_Errno("vessel_volume", "Неумелый прикладной программист подготовил дрянной объект-параметр для великолепной библиотечной процедуры" ));

   ...



Отформатируем его в предложенном в первом посте данного топика стиле "лучших практик":
Код: plaintext
1.
2.
3.
4.
// функция подсчета объема ведер и бутылок, вызов по ссылке не даст передать NULL 
   void CalcVesselVolume( const OBJECT& po ) { if( o.type != TYPE_BUCKET && o.type != TYPE_BOTTLE ) Throw( Ex_Errno("vessel_volume", "Неумелый прикладной программист подготовил дрянной объект-параметр для великолепной библиотечной процедуры" ));

   ...


Очевидно что так стало несопоставимо лучше...
Что же, может и стало, для тех, кому надо прочитать всего лишь одну строку...

Теперь код нужно откомментировать.
Я позволю себе не тратить драгоценное время "другого программиста" на
особо ценные замечания сорта "первая строчка задает имена и типы колонок",
и, тем более, на "published under GPL v3"

Просто добавим содержательный комментарий для такого "другого программиста", которого "нужно обучить",
потому что он, может быть, не понимает, что здесь происходит.
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
// псевдокод, использующий выброс ошибки при "проверке параметров"
  void CalcVesselVolume( const OBJECT& po ) { 

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

    //варианты использования:
    //а) Вызываемая процедура работает в одном (главном) потоке с вызывающей:
    //  При выбрасывании исключения управление передается в точку обработки ожидаемого исключения
    //  в коде вызывающего. Если такого места не обнаруживается, среда времени выполнения обязана уметь
    //  остановить такой поток и освободить занятые им ресурсы, без нарушения устойчивости в целом работы 
    //  запускающей среды.
    //  В Oracle Database, например, такой режим обеспечивается при запуске системой независимых pl/sql заданий (job).
    
    //б) Многопоточное окружение с главным потоком, порождающим дочерние.
    //   При возникновении ошибки в дочернем потоке среда выполнения не может просто погасить выбросивший исключение дочерний поток,
    //   а должна передать информацию о получении такого исключения в порождающий поток.
    //   В Oracle Database, например, такой режим поддерживается при параллельном выполнении SQL-запросов.
    
    //в) Распределенное окружение, вызывающий и вызываемый работают в независимых процессах,
    //   взаимодействие между которыми обеспечивается независимо от них обоих управляемой средой передачи сообщений.
    //   В Oracle Database это режим, к котром взаимодействует удалённый клиент и сервер.
    //   Пусть клиент явно запросил выполнения такой процедуры.
    //   Тогда для вызываемой процедуры вызывающим становится обслуживающий вызов серверный процесс.
    // 
    //   С точки зрения самого обслуживающего вызов процесса он всегда выполняет тот или курсор,
    //   отдавая результат выполнения в виде потока сообщений.
    //   В общем случае, при получении обслуживающим вызов процессом любого исключения,
    //   возникающем в процессе выполнения курсора, нельзя предсказать, 
    //   какого размера поток данных будет, или уже был, и был ли, отдан клиенту.
    //
    //   На стороне обслуживающего вызов процесса выполнение в этот момент должно прерваться,
    //   и сообщение о возникшей ошибке должно быть отдано клиенту отдельным сообщением, 
    //   вне потока передачи результатов выполнения заказанного курсора.
    //
    //   На стороне вызывающего клиента, в любом случае должен быть организован прием потока сообщений ошибках, переданных с сервера.
    //   Следует принять в расчет, что в составе этого же потока идут, кроме сообщений об ошибках прочие сообщения информационного плана, 
    //   докладывающие, например, о состоянии среды выполнения обслуживающего серверного процесса.
    //   Далее, в зависимости от конкретного устройства софта на клиентской стороне, обслуживающего вызов,
    //   или от его настроек, на стороне клиента может происходить или не происходить симметричный 
    //   выброс исключения, сигнализирующего о возникновении ошибки на серверной стороне.
    //   Во втором случае, клиентский код должен самостоятельно обследовать (обычно коллекцию) полученных от сервера сообщений,
    //   отделить информационные сообщения от сообщения об ошибках, и принять решение, что делать при наличии последних.
    //  
    //   На практике встречаются два подхода, один из которых либо полагается на гарантированность доставки сообщения об ошибке 
    //   и умение клиентского драйвера автоматически выбросить ошибку на клиенте, либо быть настроенным на такое умение.
    //
    //   Другой подход заключается в том, чтобы строить такие слои прикладных программных интерфейсов,
    //   которые гарантируют отсутствие необходимости анализа специального потока об ошибках,
    //   никогда не приводят к возникновению исключительной ситуации на стороне серверного обслуживающего процесса,
    //   и всю необходимую информацию явно содержат в параметрах вызываемой удаленной процедуры.    
    
     if( o.type != TYPE_BUCKET && o.type != TYPE_BOTTLE ) Throw( Ex_Errno("vessel_volume", "Неумелый прикладной программист подготовил дрянной объект-параметр для великолепной библиотечной процедуры" ));

   ...



Пожалуй, я даже не буду спрашивать у вас, где и как проходит граница
"обучающих других программистов" комментариев.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39998179
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Вообще, скоро появятся макросы...
Хмм... А что, есть реальный смысл окунаться в омут ново-глючных версий сразу?
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39998184
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
читабельность, сопровождаемость SQL кода

Ха-ха.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39998185
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Как его сделать лучше?

Никак. У нас есть такая же шляпа из union all на 1к строчек.

НеофитSQL
Я знаю об одном недостатке этого кода

Вообрази, что у тебя там параметров не 4, а 400 и выборки везде не по count таблички с условием, а что-нибудь более толстое.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39998199
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
предварительно проверив входные параметры, чтоб не генерить белиберду или пустую таблицу при плохих исходных


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

упд. Задумайтесь хоть немного о том, что декларативное описание извлечения данных из множеств зависит не только от параметров вашего запроса. Запрос возвращающий хорошие данные на юнит-тесте запросто может вернуть на реальных данных совершенно неожиданный результат. Просто потому, что оттачивая проверку параметров вы не удосужитесь проверить уникальность условий соединения множеств.
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39998202
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Код: plsql
1.
-- опубликовано на правах GPL v3 / published under GPL v3



Как насчёт привести тогда уж и код функции, а если внутри неё используются системные оракловые, то срочно начать рыть доку в поисках условий распространения кода с их использованием?
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39998219
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
В таком случае, необходимо ещё предварительно проверить все таблицы, используемые в запросе, вдруг нехороший пользователь вбил туда неидеальные данные
была у нас старая БД, тянущаяся с семерки... где был месяц=2 и число=30
...
Рейтинг: 0 / 0
Эффективность, читабельность, сопровождаемость SQL кода
    #39998567
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx
env
В таком случае, необходимо ещё предварительно проверить все таблицы, используемые в запросе, вдруг нехороший пользователь вбил туда неидеальные данные
была у нас старая БД, тянущаяся с семерки... где был месяц=2 и число=30


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

Потому что как пример 2/30 показывает, бывают ошибки (как при вводе, так и при выборе типов данных).

В своем PL/SQL коде я по возможности предохраняюсь.

Например, select into может выбить, если вернул количество строк отличное от одного. Если поиск по уникальному ключу, то про много строк можно и не беспокоиться, а пустой результат возможен, хотя вроде и не должен быть. В этом случае мой код логнет ошибку с известными параметрами, а я на следующий день посмотрю таблицу ошибок чтоб посмотреть где ошибка - в коде, в дизайне или в данных.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Эффективность, читабельность, сопровождаемость SQL кода
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]