1. Pascal / Говнокод #17233

    +90

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    Procedure ArrDataToRawImage(Ptr: PRGB32; Size: TPoint; out RawImage: TRawImage);
    Begin
    RawImage.Init; { Calls raw.Description.Init as well }
    RawImage.Description.PaletteColorCount:=0;
    RawImage.Description.MaskBitsPerPixel:=0;
    RawImage.Description.Width := Size.X;
    RawImage.Description.Height:= Size.Y;
    RawImage.Description.Format := ricfRGBA;
    RawImage.Description.ByteOrder := riboLSBFirst;
    RawImage.Description.BitOrder:= riboBitsInOrder; // should be fine
    RawImage.Description.Depth:=24;
    RawImage.Description.BitsPerPixel:=32;
    RawImage.Description.LineOrder:=riloTopToBottom;
    RawImage.Description.LineEnd := rileDWordBoundary;
    RawImage.Description.RedPrec := 8;
    RawImage.Description.GreenPrec:= 8;
    RawImage.Description.BluePrec:= 8;
    RawImage.Description.AlphaPrec:=0;
    RawImage.Description.RedShift:=16;
    RawImage.Description.GreenShift:=8;
    RawImage.Description.BlueShift:=0;
    RawImage.DataSize := RawImage.Description.Width * RawImage.Description.Height
    * (RawImage.Description.bitsperpixel shr 3);
    RawImage.Data := PByte(Ptr);
    End;

    with ... do? Не. не слышал.

    Запостил: Cynicrus, 01 Декабря 2014

    Комментарии (45) RSS

    • Pascal? Лет 15 как не слышал.
      Ответить
      • Кстати да, автор ГК небось из каких-нибудь ссей пришел, поэтому про with и не слышал.
        Ответить
        • В 99 сях есть designated initializers
          https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
          Ответить
        • > про with и не слышал
          А оно надо?
          Ответить
          • Конечно.
            Ответить
            • В опу With
              так как он только проблемы создает!
              1) при отладке не позволяет легко производить мониторинг переменных
              2) казалось бы должен легко читаться, но в тоже время может вызвать путаницу типа параметр Width к чему относится к форме или можету у RawImage.Description тоже есть такой же параметр..... (это для читаемости кода другим программистом)

              Вобщем мое мнение таково, что после написание кода убирать нафиг with!
              Ответить
    • мне кажется, неиспользование синтаксического сахара это не самый лучший пример говнокода)
      Ответить
      • Пожалуй, да. Иногда бывает, что использование with приводит к труднопрогнозируемым последствиям. Например, при использовании with трудно было бы понять, Size.X — это параметр процедуры или поле RawImage.Description.
        Ответить
        • Хуже только в ЖС. Там кроме рантайма вообще никто не знает, чем закончится использование with.
          Ответить
        • В бейсике емнип внутри With то что сокращается начинается с точки, никакой путаницы.
          With Form1
              .Width=Form2.Width
              .Height=Height
          End With
          Ответить
          • Вот это красивое решение! А в паскале и жс какое-то говно получилось.
            Ответить
            • Категорически не согласен. Чтобы с With говно не получалось в паскале, его надо использовать с умом.
              Ответить
              • Дык тут как с using namespace в крестах: юзая with мы теряем контроль над своим скопом. В класс, который мы with'нули, в любой момент могут добавить переменную, которая задавит локальную: http://ideone.com/ETfZJh И тут хоть с умом юзай, хоть не с умом - рано или поздно будет залёт.

                Или "никогда и ни при каких обстоятельствах не обращаться к локальным переменным внутри with" это и есть "использовать с умом"?
                Ответить
                • Да-да, самый сок - назвать локальную переменную Count или Size, а потом вопить "а-а-а, это все with виноват!". Нормальные прогеры юзают naming conventions и нечего у них не давится.
                  Ответить
                  • > naming conventions
                    Т.е. все локальные переменные должны начинаться с какого-то префикса, чтобы их имена гарантированно не конфликтанули с тем, что вывалилось из with? Нахуй так жить...

                    P.S. Приведи пример локальной переменной, названной в соответствии с выбранным тобой соглашением.
                    Ответить
                    • >Т.е. все локальные переменные должны начинаться с какого-то префикса, чтобы их имена гарантированно не конфликтанули с тем, что вывалилось из with?
                      С таким успехом можно написать:
                      var _=RawImage.Description; //обратите внимание на блядский _
                      _.Width = Size.X;//_. вот он - чудо-префикс! только наоборот.
                      _.Height = Size.Y;
                      Ответить
                      • А ведь всё это из-за того, что паскаль требует описывать переменные в начале процедуры. В крестах, жабе, питоне и даже жс - сохранил ссылочку на "длинную херню" в локальную переменную и вперёд.

                        И только паскалисты готовы продать душу, обменяв надежность на сиюминутное удобство.
                        Ответить
                        • >А ведь всё это из-за того, что паскаль требует описывать переменные в начале процедуры.
                          Ха! Во-первых, это js. Ибо присваивание = и нет автовывода типов.
                          И руками указывать в паскалике для временной переменной тип особенно с женериком - заёб.
                          А во-вторых, в js работает hoisting все объявления переменных тоже переносятся в самый верх функции. Только автоматически.

                          Так что аналогия определённая прослеживается.
                          Ответить
                        • На вкус и цвет. Мне например приятнее заглянуть в блок Var, где всё есть. Чем лицезреть сишные объявления не очевидных переменных. В плюсах вообще заморачиваться перестали ибо auto.
                          Ответить
                • Нет, просто думать головой, когда юзаешь with с локальными переменными. Не нужно обзывать локальную переменную Count или Size, или X.
                  Ответить
                  • Ага, а так же BitsPerPixel, Width, Height и прочими именами, которые через пару лет в этот класс может добавить какой-нибудь Вася... Или бедный Вася обязан прочитать весь код (включая код тысяч разрабов, которые пользуются его библиотекой), и с умом назвать новое поле\свойство\метод?

                    Вы серьезно не понимаете, в чем заключается проблема потери контроля над локальным скопом, и каковы ее последствия?
                    Ответить
                    • Да причём тут проблема потери над скопом. Этот код находится не в либе, и не в ядре системы для запуска спутников. А значит, этот метод - если его пишет один человек, если друг решит дописать - он тоже должен проанализировать, что же он делает, и если ему упёрлось именно в этом участке кода применить локальную переменную Description - то он сам мудак, и это не проблема With. А данный код должен быть With RawImage do begin ... end;
                      Ответить
                      • Ну если TRawImage и ArrDataToRawImage находятся в одном модуле - терпимо.
                        Ответить
                        • Хотя... лично я бы не решился променять безобидный копипаст на потенциальные проблемы (пусть даже очень маловероятные).

                          Раз в году и палка стреляет.

                          P.S. Или у вас в паскале всё покрыто тестами, и подобный косяк сразу же обнаружится?
                          Ответить
                          • >>в паскале всё покрыто тестами
                            звучит как "dependency injection в коболе"
                            Ответить
                            • - Слышь, тесты есть?
                              - Нету!
                              - А если найду?
                              Ответить
                          • Он тебе тупо собрать не даст, и выкинет Error. Delphi XE и старше по крайней мере точно, Lazarus + FPC вроде тоже.
                            Ответить
                            • Т.е. мой пример с ideone не собирается на свежих делфях? Это не может не радовать, делфи реабилитировано в моих глазах.

                              > FPC
                              На ideone как раз выбран fpc, и он всё собрал. Может опции какие-то надо...
                              Ответить
            • Если в js зафигачить точку для with, то будет оооочень весело c авторасстановкой точек с запяток *ROFL*
              Ответить
              • > авторасстановкой точек с запяток
                Которую надо выпилить нахуй и не смешить людей. В жс и без этой говнофичи хватает подводных камней.
                Ответить
          • вложенный витх и все соснули
            Ответить
            • Ну это уже ССЗБ, в отличие от паскаля и жс, где соснуть можно и с одним. Причем если в паскале компилятор хотя бы может выдать предупреждение в духе propety 'bar' shadows local variable 'bar' (но выдаёт ли?), то в жс - корейский рандом.
              Ответить
              • Выдача предупреждения (или ошибки) снимает все проблемы, что ты описываешь.
                Ответить
                • > снимает все проблемы, что ты описываешь.
                  Только для паскаля, но никак не для жс. Кстати, какой-нибудь из компиляторов паскаля его выдаёт (пример можешь взять на ideone в одном из моих постов выше)?
                  Ответить
            • Лично я никогда не юзал вложенность.
              Edit: Оказывается разрешено. Надо было просто запретить.
              Ответить
              • Не знаю. Может для with-гурманов стоило сделать типа:
                . - 1й уровень вложенности
                .. 2й уровень
                итд
                Но на мой вкус излишне сахарно.

                В сиране жабах как убогая замена with юзается инициализатор.
                final Raw raw=new Raw();
                    new RawImage(){{
                        width=raw.X;//опять же можно проебать с захваченным width. 
                        this.height=raw.Y; //потому юзают this
                    }}
                Однако лично я не рекомендую такой способ инициализации.
                По одной простой причине.
                Анонимный класс, наследующий RawImage будет содержать неявные поля (покопайтесь javap в классе с $), захваченных из контекста переменных, всякие чужие thisы, и прочее.
                Объект будет на 4/8/12 байт больше чем чистый RawImage, в зависимости от вложенности, если потом он будет хранится в памяти и попадёт в oldgen (я с таким сталкивался) возможны просадки пирфоманса.
                Ответить
              • В VB вложенный With заменяет внешний - удобно :)
                Вот бы ещё With Using у них выпросить ^_^
                Ответить
                • Заменяет или дополняет?
                  Ответить
                  • Именно заменяет. Т. е. если что-то начинается с точки, то оно гарантированно берётся из самого вложенного With'а. Не помню, с восклицательным знаком запилили фичу или нет. Но если да, то и он по тому же принципу.
                    Это в паскале как-то хитро дополняет, насколько я помню.
                    Ответить
                    • Проверил, вот)))
                      Imports System.Collections.Generic
                      
                      Module All
                        Sub Main()
                          With New Dictionary(Of String, Integer)
                            !First = .Count
                            !Second = .Count
                            !Third = .Count
                            MsgBox(String.Join(vbCrLf, .Select(Function(Kvp) Kvp.Key & " " & Kvp.Value)))
                          End With
                        End Sub
                      End Module

                      Результат:
                      ---------------------------
                      Test - VB.NET Console app
                      ---------------------------
                      First 0
                      Second 1
                      Third 2
                      ---------------------------
                      ОК   
                      ---------------------------
                      Ответить
                      • А что значит восклицательный знак?
                        Ответить
                        • Обращение к свойству словаря по константной строке.
                          Smth!SmthElse
                          Smth("SmthElse")

                          Ну и шарповариант:
                          Smth["SmthElse"]
                          Ответить
                          • Интересно. А в Бейсике для «Агата» восклицательный знак означал встроенный Ассемблер...
                            Ответить
                            • Чисто из уважения к Агату разработчикам VB.NET следовало бы встроить в него эмуляцию процессора 6502 (или кто там был в Агате) и поддержать такое вот использование восклицательного
                              Ответить
                    • > Именно заменяет.
                      Годнота!
                      Ответить

    Добавить комментарий