1. 1C / Говнокод #27164

    +3

    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
    &НаКлиенте
    Процедура ИмяФайла_ПроизводственнаяПрограммаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    	ДиалогВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    	ДиалогВыборФайла.Фильтр = "Файлы Microsoft Excel (*.xls, *.xlsx, *.xlsm)|*.xls; *.xlsx; *.xlsm|Все файлы (*.*)|*.*";
    	ДиалогВыборФайла.Показать(Новый ОписаниеОповещения("ИмяФайла_ПроизводственнаяПрограммаНачалоВыбораЗавершение", ЭтотОбъект, Новый Структура("ДиалогВыборФайла,ИмяФайла", ДиалогВыборФайла, Элемент.Имя)));
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ИмяФайла_ПроизводственнаяПрограммаНачалоВыбораЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
        
        ДиалогВыборФайла = ДополнительныеПараметры.ДиалогВыборФайла;
        
        Если (ВыбранныеФайлы <> Неопределено) Тогда
            ЭтаФорма[ДополнительныеПараметры.ИмяФайла] = ДиалогВыборФайла.ПолноеИмяФайла;
        КонецЕсли;
    
    КонецПроцедуры

    Асинхронные вызовы??? Нее.... Не слышал...

    Запостил: nytlenc, 15 Декабря 2020

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

    • Достойный конкурент для «PHP».
      Ответить
    • > Новый ОписаниеОповещения
      > Новый Структура

      В "1С" явно не хватает алиасов Новая и Новое для таких случаев... Без них читается как речь какого-то иммигранта.
      Ответить
    • > ПроизводственнаяПрограммаНачалоВыбораЗав ершение
      Шизофрения какая-то, блядь.
      Ответить
      • ...скажет любой англоговорящий, глядя на наши идентификаторы в коде
        Ответить
    • >Новый ОписаниеОповещения
      >Новый Структура

      Слющий, вах Какой Адын Эс )))
      Ответить
      • Хочу язык 1С++, где ключевые слова нужно согласовывать с родом функции и имени класса.

        Новый Питух() //ок
        Новый Группа() //UB
        Новая Группа() //OK
        Новый Кофе()// Имплементейшн дефайнд
        
        Класс Парампарампамю //ошибка: создать такой класс в куче невозможно, так как невозможно определить его род, но можно создать на стеке, в новых версиях и через умные указатели
        Ответить
        • Ну как бы очевидно. Что это русский язык, и здесь есть склонения и мужской/женский род.
          Потому в отличии 100% всегда одинакового например:
          new int;
          new bool;
          new char;

          Писать
          Структура = Новая Структура;

          или
          Массив = Новый Массив;

          Ради удобочитаемости просто глупо.
          А вообще конечно выглядит очень смешно, когда подобные Вам люди сами кодят на далеко не идеальном языке программирования, который можно также как и 1С засрамить ниже плинтуса по другим причинам, при этом обсирают другие языки и топят за свой.
          Ответить
          • > обсирают другие языки и топят за свой

            Да тут все языки равномерно обсирают, так что не принимайте наши шутки близко к сердцу ;)

            Соглашусь, недостатки есть у всех языков. Но это совсем не повод обижаться, когда упоминают недостатки Вашего любимого языка. Скорее повод задуматься о том, как можно было бы сделать лучше, если бы такая возможность была. Или просто посмеяться.
            Ответить
          • как попугаи, блять!
            Ответить
          • А откуда Вы знаете, на каком языке он пишет?
            Ответить
        • > согласовывать с родом функции и имени класса

          Как не толерантно... А если классу не нравятся дефолтные ключевые слова, и он хочет чтобы его создавали по-другому?
          Ответить
          • В определении объявлять.
            class МойКласс extends ДругойКласс implements ДругойИнтерфейс pronoun (она,её)
            Ответить
            • И менять их в каждой минорной версии.
              Ответить
            • А в крестах вот с diversity всё норм: в шаблонах на выбор есть class и typename, в описании структур есть class и struct...
              Ответить
              • А мне нравится, как в питоне. Одно и тоже можно сделать десятью разными способами.
                Или как в руби: Одно и тоже можно сделать десятью разными способами, но девять из них запрещает rubocop (в перле примерно так же)
                Ответить
                • Но... в питоне же для всего должен был быть всего один способ...
                  Ответить
                  • "There should be one-- and preferably only one --obvious way to do it".

                    https://i.imgur.com/NzCNNfz.jpg — один obvious способ и пять ня obvious.
                    Ответить
                  • Скриптоблядь всегда врёт. Если скриптоблядь не врёт, то следует проверить ей пульс
                    Ответить
                    • Подтверждаю.
                      Ответить
                      • Именно потому ты стал крестовиком?
                        Ответить
                        • Кресты просто приятны.
                          Ответить
                          • А почему их тогда все обсырают?

                            Почему я постоянно слышу какой прекрасный язык питон, какой чудесный котлин, и какие плохие кресты?
                            Ответить
                            • 95% людей – идиоты.
                              Ответить
                              • Это правда

                                А еще Данниг с Крюгером вносят свою лепту
                                Ответить
                            • Просто анскилябры заедушные. Я готов покритиковать кресты не за сам язык, а экосистему вокруг него построенную - все эти проволочки с имплементацией 20 стандарта в конпеляторы, смейк и прочая питушня. Питон хорош, а вот от Котлина веет неприятным жава душком.
                              Ответить
                              • Питон тоже говно, на самом деле. Он хорош для написания тупых скриптов на один экран, а для крупных проектов -- нет.

                                От коко, разумеется, веет джавой: он для этого и делался.

                                Был анек, как от мужика воняло говном, он побрызгался дезодорантом "лесной", и теперь пахнет так, будто кто-то под елкой насрал
                                Ответить
                                • Почему это питон - говно для крупных проектов? Из-за отсутствия явной типизации? Ну так юзай тайп хинты. На питоне можно и наметушить нормально, если знать как.
                                  Ответить
                                  • Тайпхинты — это мёртвому припарки. Они, конечно, лучше, чем ничего, но хуже, чем любая более-менее нярмальная статическая типизация.
                                    Ответить
                                    • Если у тебя нормальная дев среда с нормальным линтером и статическим анализатором - тайп хинты отличная штука, и спасает от большинства ошибок, выявлемых в тех же крестах на этапе конпеляции. Но все это при условии, что ты пишешь нормально, с нормальной архитектурой и неймингом, и покрываешь все тайпхинтами как следует.
                                      Ответить
                                      • Во-первых, далеко ня для всех библиотек есть тайпхинты, что нямножко сводит на нет их смысл.
                                        Во-вторых, из-за глубокой динямичности Питона далеко ня для всех библиотек в принципе возможно сделать тайпхинты. Рассмотрим, няпример, подобие Django ORM:
                                        q = User.query(age__gt=17, name__startswith='A', country__eq='RU')

                                        — какой тайпхинт должен быть у параметра kwargs метода query()?
                                        В-третьих, дженерики в Питоне совершенно убогие: ты ня можешь, няпример, принять (x: T, y: U) и вернуть тип (x + y).
                                        Или вот:
                                        T = TypeVar('T')
                                        def find_x(lst: List[T], x: T) -> int:
                                            for idx, val in enumerate(lst):
                                                if val == x:
                                                    return idx
                                            return -1
                                        # ...
                                        idx = find_x([1, 2, '3'], 3)

                                        — ни mypy с максимальня строгими нястройками, ни pyright с "typeCheckingMode": "strict" ня выдадут тут ни малейшего писка.
                                        Ответить
                                        • >x+y

                                          Сеанса отсоса питухона у тайпскрипта
                                          function foo<T, U>(x: T, y: U): T & U {
                                              const a = {...x, ...y};
                                              return a;
                                          }
                                          Ответить
                                          • > T & U
                                            А что это за тип?

                                            А, няшла. Ну это нямного не то, я имела в виду:
                                            template<typename T, typename U>
                                            auto foo(const T & x, const U & y) -> decltype(x + y) {
                                                return x + y;
                                            }

                                            (В этом случае decltype() ня нужен, в принципе)
                                            Ответить
                                            • Это тип выражения "x+y"?

                                              Я в TS так не умею, хотя оператор typeof для получения типа там есть
                                              Ответить
                                              • Да.
                                                Ну и Питоньи тайпхинты ня умеют.
                                                Ответить
                                                • А тип филда у структуры ваш decltype может??
                                                  const foo = {
                                                      someField: 'a'
                                                  }
                                                  
                                                  const bar: typeof foo['someField'] = 'hello';
                                                  Ответить
                                                  • > тип филда у структуры ваш decltype может

                                                    Там любое выражение работает.

                                                    Что-нибудь в духе decltype(foo().a) должно прокатить. Ну или если у тебя уже есть объект и ты просто времянку под его поле пилишь:
                                                    decltype(f.a) tmp = f.a;
                                                    З.Ы. Хотя в таких случаях и тупо auto можно написать...
                                                    Ответить
                                                    • круто) Вынужден признать, что все сосннули у крестов
                                                      Ответить
                                                  • В смысле? decltype() — это "ручной" доступ к выводу типов, он может вывести тип любого выражения, у которого тип есть.
                                                    struct Foo { std::string someField = "a"; };
                                                    // ...
                                                    decltype(Foo::someField) bar = "hello";
                                                    Ответить
                                                    • круто) Вынужден признать, что все сосннули у крестов
                                                      Ответить
                                    • по-моему это просто отношение между статическим анализом, тестами и типами. Больше типов - меньше тестов

                                      если говно на питоне не типизировано но покрыто тестами от души то оно может вполне успешно расти до огромных размеров

                                      возможно и тесты и типы это просто сорта статического анализа в современном мире где можно все скомпилировать в жс и интерпретировать
                                      Ответить
                                      • Статические типы — дешёвый способ гарантировать отсутствие определённых поведений в программе. Дешёвый, т.к. машина всё сама проверяет. Заменять их ручными тестами — закат солнца вручную.
                                        Ответить
                                      • Это ровно то, что говорили питонисты двадцать лет: код нужно покрывать тестами, и тогда статический анализ не нужен.

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

                                        Алсо, рефакторинги с типизацией делать проще (удачи с переименованием свойства "user" или "id" без нее).

                                        Это давно поняли скриптовики, именно потому в крупных скриптопроектах у нас тайпхинты. Или TS.
                                        Ответить
                                        • двадцать лет назад это было правдой потому что можно было завести команду тестировщиков и тестировать все полмесяца до квартального релиза

                                          сейчас в любом проекте есть и типы, и тесты, и стат. анализ просто потому что реалии разработки изменились и надо высрать какую-то хуйню до конца спринта и желательно чтобы это ничего не сломало, а тестить долго
                                          Ответить
                                          • А сейчас везде работают по методологии https://en.wikipedia.org/wiki/Rapid_application_development.
                                            Ответить
                                          • Двадцать лет назад еще было много проектов состоящих из одного файла типа "shop.pl"
                                            Ответить
                                  • Явная типизация тут не причем. Вывод типов ничуть не хуже.
                                    Речь скорее про статическую.

                                    Тайпхинты могли бы иметь смысл, если бы ими был покрыт весь код. А он не покрыт.
                                    Ответить
                                    • Не отвечай уёбку.
                                      Ответить
                                    • Так покрой. Даже для тайп-агностик кода завезли например вариадические дженерики.
                                      Ответить
                                      • Покрыть что?
                                        Все существующие библиотеки?
                                        Ответить
                                      • Как бы ты покрыл тип параметра kwargs у метода User.query()?
                                        @dataclasses.dataclass  # Чтобы ня писать конструктор
                                        class User:
                                            age: int
                                            name: str
                                        
                                            def query(self, **kwargs) -> bool:
                                                def _split_query_arg(arg: str) -> Tuple[str, str]:
                                                    idx = arg.rfind('_')
                                                    return arg[:idx], arg[idx + 1 : ]
                                            
                                                res = True
                                                for arg, value in kwargs.items():
                                                    property_name, method_name = _split_query_arg(arg)
                                                    prop = getattr(self, property_name)
                                                    res = res and getattr(prop, f'__{method_name}__')(value)
                                                
                                                return res
                                        
                                        
                                        def main() -> None:
                                            u1 = User(17, 'Petuh')
                                            u2 = User(20, 'Nya')
                                        
                                            print(u1.query(age_gt=18))
                                            print(u2.query(age_gt=18))
                                            
                                            print(u1.query(age_lt=18, name_gt='AAA'))
                                            print(u2.query(age_gt=17, name_eq='Nya'))

                                        И это ня высосанный из пальца пример, это практически дословная реализация того, что есть в Django ORM.
                                        Ответить
                                        • Будет чесны: такую ебанину хорошо бы кодогенерить, а когда в коде есть getattr, то тут только сосат6
                                          Ответить
                                          • А зачем? Достаточня один раз её няписать. Или ты предлагаешь генерить методы из декартова произведения {attr_1, attr_2, ...} x {'lt', 'gt', 'eq', 'startswith', ...}?

                                            > а когда в коде есть getattr, то тут только сосат6
                                            Да, в этом и проблема. Его, в принципе, можня на __dict__ заменить, но это шило ня мыло.
                                            Ответить
                                            • Именно это я предлагаю)

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

                                              В джанге правда эта хуита транзитивна

                                              user__pet__second_owner__name_eq='foo'

                                              так что можно соснуть цикла
                                              Ответить
                                              • Тогда мы теряем динямику. Тот же query() выше, няпример, будет прекрасня работать для любых классов: можня даже вынести его в функцию, получится такой себе DSL. А в статике это будет очень больня, очень долго и очень ограничення.
                                                Ответить
                                                • Так если ты это генеришь, то будет так:

                                                  Ты описала модель, запустила скрипт, и получила тысячу таких вот классов, все с нужными методами
                                                  не?
                                                  Ответить
                                                  • Вообще, кодогенерация — это няудобный костыль, для более-менее приемлемой работы с которым нужня качественная поддержка в IDE. А когда её нят (просто custom build step) — всё очень печальня.
                                                    Ответить
                                                    • неудобный, зато мощный

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

                                                      А для IDE это будет просто код же
                                                      Ответить
                                                      • Во-первых, тогда для тайпчекинга/компиляции будет няобходим отдельный build step. Во-вторых, сгенерированный код няльзя просто взять и изменить: для этого нужно менять шаблон и генерировать всё заново.
                                                        Ответить
                                                        • Ну да, а что такого?

                                                          Я вот поменял data-model.json например, вызвал "generate-code", и получил для него ORM (это всё в выдуманной среде)

                                                          Помнишь как генерация прокси-классов по WSDL работала для SOAP?

                                                          Или например CoreData у ябла так делает: генерирует классы по описанию модели
                                                          Ответить
                                                          • > и получил для него ORM
                                                            А как потом полученные классы править?
                                                            Ну вот хочу я добавить в User метод "is_adult()" — в питоньих ORM без кодогенярации я просто открываю user.py и просто пишу "def is_adult(self): ...".
                                                            А в системе с кодогенерацией тут же нячинаются костыли и прыжки с бубнями.
                                                            Ответить
                                                            • >А как потом полученные классы править?
                                                              А зачем?

                                                              >Ну вот хочу я добавить в User метод
                                                              Экстеншен методы/миксины тебе в помощь.

                                                              Или можно динамически добавить метод:
                                                              В руби например это вообще элементерано делается, и повсюду используется. Да и в JS тоже легко

                                                              Или вот знаешь как C# для WinForms генерит partial классы?
                                                              Там часть класса твоя, а часть генерённая

                                                              Читни про partial classes
                                                              Ответить
                                                              • > А зачем?
                                                                Чтобы в коде писать "if user.is_adult(): ", а ня "if user.age >= 18: ".

                                                                > Экстеншен методы/миксины
                                                                > partial classes
                                                                В контексте кодогенерации — это и есть те самые костыли и бубны, о которых я писала.

                                                                > Или можно динамически добавить метод
                                                                И вся статика някает.
                                                                Ответить
                                                                • >Костыли и бубны,
                                                                  а в чем костыли?

                                                                  >И вся статика някает.
                                                                  ну рубимайн как-то умеет, но в целом плохо, согласен

                                                                  Так а что плохого в extension methods и partial classes?
                                                                  В чем бубны?

                                                                  алсо, есть кокогенерация парсеров у intellij на основе jflex, там можно сказать "в сгенеренный файл добавиь мне такой вот метод", но это конечно выглядит как говно
                                                                  Ответить
                                                                  • > а в чем костыли?
                                                                    В том, что стоит задача: добавить в класс User метод is_adult(). Без костылей и бубнов это делается ровно одним способом: открывается файл с определеняем User, ищется определение User, в него добавляется метод is_adult().

                                                                    Extension methods а-ля Коко, кстати, ня подойдут: их нужня импортировать отдельня.
                                                                    Partial classes — наименее костыльный, но нам всё равно для каждого класса нужня иметь два файла: один сгенерированный, другой ручной. Более того, рефакторинг такой системы будет тем ещё удовольствием: снячала рефакторим шаблон, потом вручную чистим все partial-расширения.
                                                                    Ответить
                                                                    • >их нужня импортировать отдельня.
                                                                      и что? Почему это плохо?

                                                                      > рефакторинг такой системы будет тем ещё удовольствием:
                                                                      Рефакторинг модели это вообще тяжко, твои методы тут будут не самым страшным местом

                                                                      Ладно, вот тебе еще вариант: отказаться от ООП вообще и генерировать тупые структуры/DAO и весь свой код держать отдельно, в функциях и процедурах
                                                                      Ответить
                                                                      • > и что? Почему это плохо?
                                                                        Потому что
                                                                        import user
                                                                        import user_extensions

                                                                        хуже, чем
                                                                        import user

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

                                                                        > Ладно, вот тебе еще вариант: отказаться от ООП вообще и генерировать тупые структуры/DAO и весь свой код держать отдельно, в функциях и процедурах
                                                                        Можня ещё ня Хаскелль перейти. Ну, просто чтобы добавить метод is_adult() в класс User.
                                                                        Ответить
                                                                        • >. Для джависта два импорта всегда приятнее, чем один.

                                                                          Если я пишу в Intellij, то у меня вообще автоимпорт:)
                                                                          Я жму cltr+space, и мне подсказывают методы. Я могу даже не знать, что это экстеншен метод

                                                                          >Можня ещё ня Хаскелль перейти
                                                                          А это поможет?


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

                                                                          Есть еще вариант сказать, что я срал-ебал стат типизацию, писать на пятом перле в Notepad++, и не забивать себе голову ерундой
                                                                          Ответить
                                                  • А Питон тебя не ограничивает в таком подходе. Пожалуйста — юзай импорт хук, прикручивай туда модификацию AST дерева и делай с кодом че хочешь. По сути таким образом можно ввести любые правила, хоть даже шаблоны реализовать. Потому что например информация о тайп-хинтах доступна и в рантайме. Все это делается на ините модуля, а-ля время компиляции. Хороший пример https://github.com/orf/inliner. По сути реализация встраивания тел методов, как раз таки через модификацию AST.
                                                    Ответить
                                                    • Удачи тебе с поддержкой этого дела в статическом анализе, например в кодинсайте IDE
                                                      Ответить
                                                      • Ну учитывая, что кодинсайт можно подрубить свой, можно и добавить туда соответсвующие правила. Делаем один раз таки.
                                                        Ответить
                                                        • не понял про свой кодинсайт

                                                          IDE построила AST по коду, и подсказывает мне методы

                                                          откуда она знает, что при импорте класса ему добавился метод?

                                                          Или ты за запуск класса в LSP сервере? Тогда как гарантировать что там нет хальтинг проблем?
                                                          Ответить
                                                          • Я про то что средства кодинсайта у того же пайчарма подключаемые, там как правило опенсорсные решения, можно подправить по себя.
                                                            Ответить
                                                            • то есть ты предлагаешь написать на джаве код для пайшарма, в который вшить те же самые знания о том, какие там поля в класс добавляются на лету?
                                                              Ответить
                                                              • Так там пайлинт под капотом, его и меняешь. Никакой вонючей жавы.
                                                                Ответить
                                                                • и дохуя тебе пайлинт поможет закомплитить имена параметров в Django ORM?:)
                                                                  Ответить
                                                                  • Так мы не про джангу разговариваем. А про кодогенерацию.
                                                                    Ответить
                                                                    • Не важно соврешенно

                                                                      ну вот я на лету добавляю в класс метод fooN, где N это 42, если у тебя Linux, и 62 если Mac OS

                                                                      Как мне поможет пайлинт?
                                                                      Ответить
                                                                      • Ну смотри, если ты введешь туда правило, что если допустим у тебя метод обернут в специфический декоратор, в зависимость от платформы его надо понимать так то и так то.
                                                                        Ответить
                                                                        • У меня пока нету метода, мне не на что навешивать декоратор

                                                                          Возьмем реальный пример из джанго.

                                                                          Если у класса есть поле foo = models.ForeignKey(Bar), то у класс-метода filter есть аргумент foo__[тут_любое_поле_Bar]_eq

                                                                          Выразишь мне это в pylint?
                                                                          Ответить
                                                                          • Вполне реализуемое правило. Значит декоратор лепим на класс, и по нему ориентируемся в измененном пайлинте.
                                                                            Ответить
                                                                            • Я не понимаю, как мне это поможет сделать комплишен.

                                                                              Пайлинт умеет вернуть список всех методов класса, сгенерив его динамически?
                                                                              А хальтинг проблем как решается?
                                                                              Ответить
                                                                    • вы эту метушню слюнявите уже второй год
                                                                      Ответить
                                          • Ну гетаттр это чистая динамика, тут ясен хуй.
                                            Ответить
                                            • Прелесть скриптоговна во многом в бесплатной динамике

                                              Как только ты пытаешься завезти туда статику, у тебя сразу начинаются проблемы
                                              Ответить
                              • > от Котлина веет неприятным жава душком
                                Так Котлин и есть Джава для белых аниме-девочек. Такая себе Антиджава, по анялогии с антикафе.

                                От "data class X(private val a: Int, var b: Double)" у настоящего джависта нячинается ломка.
                                Ответить
                                • > у нястоящего джависта нячинается ломка

                                  Сразу хочется написать конструктор, геттеры, сеттеры, хешкод, компаратор и преобразование в строку?
                                  Ответить
                                  • И вынести в отдельный файл!

                                    И вот уже можно ня перерыв отправляться.
                                    Ответить
                                  • И интерфейс экстрактнуть.

                                    Реально видел интерфейс с десятком сеттеров и геттеров, и его реализацию в виде бина (ну то есть просто филды и методы)
                                    Ответить
                                    • Зато как KPI-то растёт!

                                      https://kpilibrary.com/kpis/lines-of-code-per-day-2
                                      Ответить
                                      • предлагаю считать количество символов напечатанных в день

                                        Сайт, кстати, классный
                                        <!--[if IE 7]> <html class="ie7"> <![endif]-->

                                        спасибо, что вернули мой 2006-й
                                        Ответить
                                    • Вообще я за Идеальный Язык, в котором из класса прямо по умолчанию будет генерироваться интерфейс, и все довольны. Клиенты пользуют интерфейс, библиотека стандартную реализацию, всё в легкую заменяется при необходимости.
                                      Ответить
                            • Потому что крестовички честны с собой.
                              Ответить
                          • > Кресты просто приятны.

                            Да, особенно приятно, когда NULL это 0 но при этом (void *)(1-1) это не тот NULL https://govnokod.ru/26958#comment576762

                            Или когда std::vector<bool> оказывается какой-то сраной битоебской хуйней, а все прочие специализации ведут себя нормально.
                            Ответить
                            • >> Кресты просто приятны.

                              Не забывай, что он из джавы пришёл...
                              Ответить
                              • Не, не из джавы. Мое соприкосновение с жавой за всю жизнь — написанные пару классов для какой-то говнины.
                                Ответить
                              • Из пхп он пришел

                                Хватит уже нас путать)
                                Ответить
                            • 1) Может будешь юзать nullptr, а не эту говнину?
                              2) Это как? Булы в векторе пакуются в битмаски?
                              Ответить
                              • > 1) Может будешь юзать nullptr, а не эту говнину?

                                Если надо именно нулевой физический адрес взять, мне nullptr не подойдет, и (void*)0 не подойдет, надо делать (void*)(1-1)

                                > 2) Это как? Булы в векоторе пакуются в битмаски?

                                Да, погугли.
                                https://alenacpp.blogspot.com/2005/06/vector.html
                                И говностандартизаторы эту "фичу" так и не пофиксили. Зато какие-то там модули выдумывают.
                                > Проблема с vector <bool> была замечена в конце 96-го года, Bill (PJ) Plauger (кстати, он президент той самой компании Dinkumware, которая писала реализацию STL для Visual C++ 5.0) упомянул о ней в статье C/C++ Users Journal.
                                Ответить
                                • The manner in which std::vector<bool> is made space efficient (as well as whether it is optimized at all) is implementation defined. One potential optimization involves coalescing vector elements such that each element occupies a single bit instead of sizeof(bool) bytes.

                                  Вижу. Ну в целом, а надо ли получать сырой аррей булов из вектора? Наверное не очень. Если сделать вектор страктов, то уверен — оно будет вести себя нормально. Это между прочим неплохая оптимизация по памяти, битоебство это.
                                  Ответить
                                  • > Вижу. Ну в целом, а надо ли получать сырой аррей булов из вектора?

                                    Да, вполне могу представить, чтобы это было надо.

                                    > Если сделать вектор страктов, то уверен — оно будет вести себя нормально.

                                    Лучше б std::vector сделали нормальным, чтобы для специализации с bool-ом была та же хуйня, как и со специализации по другим типами.
                                    Ответить
                                    • Ну в целом согласен, побитовую питушню можно было бы вводить каким-нибудь дополнительным параметром конструктора, политикой ну или прагмой на случай нестандарта.
                                      Ответить
                                  • Основная проблема даже ня в том, что он тормозит, а в том, что std::vector<bool> ня соответствует требованиям к контейнерам. Для всех остальных специализаций явно требуется, чтобы std::vector<T>.operator[](size_t idx) возвращал T&, а для std::vector<bool> это ня выполняется. Это может приводит к крайне няприятным и трудноуловимым багам.
                                    template<typename T>
                                    struct VectorEraser {
                                        static void erase_T(T & x)
                                        {
                                            x = T{};
                                        }
                                    
                                        static void erase_vector(std::vector<T> & vec)
                                        {
                                            // Или it = vec.begin(), или const auto & x : vec, ня важно
                                            for (size_t i = 0; i < vec.size(); i++) {
                                                erase_T(vec[i]);
                                            }
                                        }
                                    };
                                    
                                    int main()
                                    {
                                        std::vector<int> vec1{ 1, 2, 3, 4 };
                                        std::vector<bool> vec2{ true, true, false, true };
                                    
                                        VectorEraser<int> eraser1{};
                                        VectorEraser<bool> eraser2{};
                                        // Работает для любых T (которые можно = T{}), кроме bool
                                        eraser1.erase_vector(vec1);
                                        eraser2.erase_vector(vec2);  // Ня работает
                                    }

                                    То есть для разработки обобщённых алгоритмов ня векторах придётся либо всегда держать в уме, что тебе, кроме нормальных векторов, может попасть няведомая хер-ня "std::vector<bool>", либо просто забить на неё.
                                    Ответить
                                • > пофиксили

                                  А как? Сделать новый std::real_vector<>, без этой говнофичи?

                                  Здесь нужна картинка с xkcd про перегрев компа при нажатии на пробел.
                                  Ответить
                                  • > А как? Сделать новый std::real_vector<>, без этой говнофичи?

                                    Поменять. Выкинуть нахуй эту говноспециализацию из std::vector<> и сделать как с прочими типами.
                                    Ответить
                                    • > Выкинуть нахуй эту говноспециализацию

                                      Но... ею ведь кто-то пользуется. А тут вдруг потребление памяти вырастет в 8 раз и всё распидорасит.

                                      Кресты -- не питон чтобы взять и по-быстрому* перехуячить весь язык и выбросить всё легаси.

                                      * за десяток лет, лол

                                      З.Ы. Хотя вот auto_ptr выпилили т.к. у него есть 100% адекватная замена.
                                      Ответить
                                      • Если у тебя в проекте одни булевые вектора, то это явно багор
                                        Ответить
                                      • > Но... ею ведь кто-то пользуется. А тут вдруг потребление памяти вырастет в 8 раз и всё распидорасит.

                                        Ну и пошли они нахуй. Пусть пробегутся по своему говнокоду регекспом, который заменит на какой-нибудь std::bitset всю ту хуйню, где этим пользуются.
                                        Ответить
                                      • > Кресты -- не питон чтобы взять и по-быстрому* перехуячить весь язык и выбросить всё легаси.

                                        Это говно с std::vector<bool> в STL еще в конце 96-го года заметили, еще до стандартизации крестов-с-STL (STL в C++98 появился) и это говно всё равно застандартизировали. Вот где багор )))

                                        Если бы биологическая эволюция работала как эволюция крестоговна, мы бы до сих пор размножались делением, дышали бы одновременно жабрами, легкими и через кожное дыхание как лягушки. Потому что комитет по эволюции человека решил так, отказ от размножение делением и дыханием как у лягушек ломает какую-то обратную совместимость, которая очень нужна
                                        Ответить
                                        • > и это говно всё равно застандартизировали

                                          Лебедь, рак и щука же.

                                          Не добавите наш особый кейс в стандарт -- мы вообще его реализовывать не будем. Со "стандартом" SQL точно так же получилось.
                                          Ответить
                                  • xkcd зашкуарен
                                    Ответить
                                    • А xfce?
                                      Ответить
                                      • с самого начала был
                                        UI не должен быть уродливым
                                        особенно в такой сомнительной среде как прыщи
                                        Ответить
                              • > будешь юзать

                                Да, последние стандарты весьма няшные по сравнению с тем, что было в 90х...

                                Но кресты -- это, как правило, не модные хипстерские проекты, а легаси с историей в десятки лет. Поэтому рано или поздно и auto_ptr увидишь и strstream вместо stringstream.

                                > битмаски

                                Угу. И это пиздец лагает если по ним бегать алгоритмами. Т.к. приходится каждый бит выковыривать и потом засовывать обратно.
                                Ответить
                                • > хипстерские проекты
                                  А ты не находишь хипстерские проекты на джангопитоне или каком-нибудь node.js немного отвратительными? Имхо крестовые легаси проекты на уровне хотя бы 2003 стандарта могут быть и поприятнее таких, если там конечно реально 2003 стандарт, а не Си с классами.

                                  К слову, если речь не о легаси — можно начинать писать новые проекты нормально.
                                  Ответить
                                  • Х.з., если честно, мне веб не особо интересен...

                                    Коллбечная лапша как в старой ноде -- это треш, конечно.
                                    Ответить
                                    • Я полностью согласен, мне тоже. А хипстерские проекты — тем не менее, это в большинстве случаев веб или около того.
                                      Ответить
                                    • Чувак, нету уже лапши. Есть промисы, есть асинк, и типизация есть в TS.

                                      Другой вопрос, что вебщики это лалки анскильные обычно, и тебе с ними будет не интересно
                                      Ответить
                                      • > нету уже лапши

                                        Я знаю... Там же написано "в старой".
                                        Ответить
                                        • ну в старой да. Вообще старый JS это ад

                                          Как люди писали SPA в 2009 -- это пиздец. Разве что на GWT
                                          Ответить
                                          • Забавно кстати, что в начале нулевых в крестах было много случайных людей, которые попали в кресты просто потому, что большинство софта было на крестах.

                                            К середине нулевых они все посъябывали на свои PHP, и к 10-м в крестах остались уже те, кто осознанно выбрал путь самурая
                                            Ответить
                                          • extjs
                                            Ответить
                                • > Да, последние стандарты весьма няшные по сравнению с тем, что было в 90х...

                                  Сколько говно не посыпай сахаром, оно остается говном. Тут надо менять первоосновы. Фундамент, так сказать.
                                  Ответить
                                  • Да, меня тоже x86_64 заебал
                                    Ответить
                                  • Но ведь фундамент крестов — это C...
                                    Ответить
                                    • Поэтому большинство крестопроблем – это сишкопроблемы.

                                      Note that the value of a null pointer in the C language does not matter on the underlying architecture. If the underlying architecture has a null pointer value defined as address 0xDEADBEEF, then it is up to the compiler to sort this mess.

                                      При этом компилятор оптимизирует только 0 и NULL константы, а какой-нибудь mynullptr = 0xB00B5 уже, может быть, и не оптимизнёт!
                                      Ответить
                                      • >Поэтому большинство крестопроблем – это сишкопроблемы.

                                        как раз сишная часть крестов вполне себе проста для понимания, кмк

                                        Сюрпризы нас ждут в тех местах, которых в няшной нету: RAII, перегрузки, и шаблоны
                                        Ответить
                                    • > Но ведь фундамент крестов — это C...

                                      Yes.
                                      Ответить
                                    • https://govnokod.ru/23287#comment389570

                                      j123123 28.08.2017 22:35
                                      > Эхх, в том то и дело, проблема как раз в том, как этот ваш C++ эволюционировал. А эволюционировал он так, чтобы быть совместимым с Си. И вот это и есть основная, дерзчайшая ошибка. Нельзя строить язык высокого уровня, коим хочет быть C++, на основе C.
                                      Ответить
                                      • а что ты предлагаешь? Делать два языка: тяжелые штуки писать на сях, а высокоуровневную питушиную логику на каком-нить питоне?
                                        Ответить
                                        • надо на UML писать, ну!
                                          Ответить
                                        • Мощный метаязык для создания DSL нужно делать, и на нем выражать абстракции высокого уровня, которые транслируются (транспилируются, компилируются) известным способом в абстракции более низкого уровня. А не производить прямое смешивание высоко и низкоуровневой хуины. Никто ж в здравом уме не будет за то, чтобы ассемблерные вставки в каком-нибудь Ruby юзать, верно? Низкоуровневую поеботу можно отделять в отдельные модули, и там пусть она себе живет, и наружу не протекает. А в крестах низкоуровневая поеботина постоянно протекает наружу.

                                          Про идею с DSL я вот там изгалал https://govnokod.ru/27116#comment622955
                                          Ответить
                                          • а, ну так собсно такое уже есть: пиши там на C# каком нить, а лоу левел код пиши на си
                                            Ответить
                                            • > пиши там на C# каком нить, а лоу левел код пиши на си

                                              Ну вот. Тогда на кой хрен кресты?

                                              Проблема использования двух разных языков с двумя принципиально разными компиляторами/рантаймами заключается в том, что они не могут быть совместно-оптимизируемыми, скажем так. Если у меня написано куча кода на Си, я его в одну единицу трансляции сшиваю и компилирую (т.е. link-time optimization), то у меня компилятор видит всю программу и может сделать много чего. А если у меня сишарп который вызывает хуиту на сишке, он нихуя с ней сделать не может. И сишка про сишарп тоже нихуя не знает. Ничего никуда не заинлайнится и не наанроллится.

                                              Если сделать метаязык, который в себе охватывает разные уровни абстракции, и позволяет их адекватно (не так как кресты) совмещать и объединенно компилировать, с применением в т.ч. всяких там частичных вычислений и символьного выполнения, чтобы zero-cost абстракции - вот это будет круто.
                                              Ответить
                                              • То есть ты в принципе за ОДИН язык ради линк тайм оптимизации и зеро абстракций, но тебе именно кресты не нравятся?
                                                Ответить
                                                • > То есть ты в принципе за ОДИН язык ради линк тайм оптимизации и зеро абстракций, но тебе именно кресты не нравятся?

                                                  Примерно так, но не точно и не полностью. Я против того, как в крестах смешиваются уровни абстракции. Можно сделать так, чтобы в рамках одного метаязыка описывались правила трансляции абстракций высокого уровня в абстракции низкого уровня. На абстракциях высокого уровня пишем высокоуровневый код, который не допускает абстракции низкого уровня внутри себя (но вполне можно вызывать что-то низкоуровневое в высокоуровневом коде). Через определенную систему типов и систему символьных вычислений можно выводить и/или описывать определенные свойства реализации алгоритмов. Ну скажем, что сортировка выдает массив такой, что в нем элементы с меньшим индексом всегда меньше или равны элементы с большим индексом, это можно выразить неким типом, и тогда второй раз сортировка уже никак этот сортированный массив не поменяет... Короче, почитай то, что я написал в комментарии https://govnokod.ru/27116#comment622955 и двумя комментами ниже него. Почитай про идеи суперкомпиляции (оптимизации методом частичных вычислений https://keldysh.ru/papers/2008/prep12/prep2008_12.html#_Toc193602742 ), проекции Футамуры. Вот так примерно надо это проектировать.

                                                  Проблема крестов в том, что его делали прагматики, а не идеалисты, типа вот Страуструп тот же, взял сишку, подкостылил, получил какую-то хрень, потом опять подкостылил, и еще, и потом шаблоны еще начали использовать под какую-то хуйню, под которую их изначально не придумывали, и вот так строят всякие хреновые небоскребы из говна и костылей, один костыль подпирает второй костыль, второй подпирает третий, и весь этот сраный ворох говна так и накапливается
                                                  Ответить
                                    • Не знаю насчет крестов, но фундамент говнокода™ - это ирония на связанные с программированием темы.
                                      Ответить
                                  • ну степень говнистости всё же уменьшилась

                                    Как петухи писали без смарт поинтеров? а без мувов как?
                                    Это же вручную солнце закатывать в каждом классе нужно
                                    Ответить
            • Да, раньше pronoun можно было вывести, но теперь pronoun inference не работает, приходится указывать его явно
              Ответить
      • Адин це. Дурилка!
        Ответить
        • «Це» — це украинство якесь. Уроженцы Кавказа так не говорят.
          Ответить
          • Только "українство".
            Ти давно ВНЗ закінчив?
            Ответить
            • >Только
              Тільки, чи нi?
              Ответить
              • Не знаешь куда подевался «inkanus»?
                Ответить
                • не знаю

                  он в жж пишет?
                  Ответить
                  • Не знаю. А есть ссылки?
                    Ответить
                    • тыж мне сам его блох показывал
                      Ответить
                    • надо подумать

                      https://inkanusgray.livejournal.com/
                      Ответить
                      • Он в твиттере активность вёл, но там его забанили, а другой его файки я не знаю.
                        Ответить
                        • неполиткорректный небось

                          на лавнхейте он есть, не?
                          Ответить
                          • МАКАКА, эта песня для тебя

                            https://github.com/sarah-walker-pcem/pcem
                            Ответить
                          • Не в курсе про такой петушатник.
                            А, понял о чем ты.
                            Ответить
                            • Первый раз я услышал про L&H в 2000-м. Второй раз от Инкануса
                              Ответить
                              • Ебать ты олд.
                                Ответить
                                • "Лавхэйт был создан в 1998 году хабаровским программистом-фрилансером Серёжей Ткачуком как визитная карточка и демонстрация своих навыков в perl." (c) лукр

                                  Инканус тоже не молод
                                  Ответить
                                  • > демонстрация своих навыков в perl

                                    Он опенсурсный что ли?
                                    Ответить
                                    • В 1998-м году скорее всего он мог послать .tar.gz с сырцами заинтересованной стороне.

                                      Публичный CVS он вряд-ли стал бы держать, разве что на сурсфорж или фрешмит бы выложился

                                      А почему ты спрашиваешь? Хочешь почитать перл образца 1998-го года?:)
                                      Ответить

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