Бухгалтерия / Говнокод #27164 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 nytlenc, (Updated )

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

  • > Новый ОписаниеОповещения
    > Новый Структура

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

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

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

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

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

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

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

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

        Как не толерантно... А если классу не нравятся дефолтные ключевые слова, и он хочет чтобы его создавали по-другому?
        Ответить
        • В определении объявлять.
          class МойКласс extends ДругойКласс implements ДругойИнтерфейс pronoun (она,её)
          Ответить
          • А в крестах вот с diversity всё норм: в шаблонах на выбор есть class и typename, в описании структур есть class и struct...
            Ответить
            • А мне нравится, как в питоне. Одно и тоже можно сделать десятью разными способами.
              Или как в руби: Одно и тоже можно сделать десятью разными способами, но девять из них запрещает rubocop (в перле примерно так же)
              Ответить
              • Но... в питоне же для всего должен был быть всего один способ...
                Ответить
                • Скриптоблядь всегда врёт. Если скриптоблядь не врёт, то следует проверить ей пульс
                  Ответить
                        • А почему их тогда все обсырают?

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

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

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

                                  Тайпхинты могли бы иметь смысл, если бы ими был покрыт весь код. А он не покрыт.
                                  Ответить
                                  • Так покрой. Даже для тайп-агностик кода завезли например вариадические дженерики.
                                    Ответить
                                    • Как бы ты покрыл тип параметра 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)" у настоящего джависта нячинается ломка.
                              Ответить
                              • > у нястоящего джависта нячинается ломка

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

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

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

                                      Сайт, кстати, классный
                                      <!--[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 точно так же получилось.
                                        Ответить
                            • > будешь юзать

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

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

                              > битмаски

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

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

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

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

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

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

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

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

                                    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, перегрузки, и шаблоны
                                      Ответить
                                  • https://govnokod.ru/23287#comment389570

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

Добавить комментарий для guest Отменить ответ

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8