1. Лучший говнокод

    В номинации:
    За время:
  2. C++ / Говнокод #25562

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    // https://github.com/WebKit/webkit/blob/e0e7e8f907f4c01c723374e8230a63d46e89e6a0/Source/WebCore/platform/graphics/filters/FEComposite.cpp#L98
    
    static unsigned char clampByte(int c)
    {
        unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
        unsigned uc = static_cast<unsigned>(c);
        return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
    }

    j123123, 22 Апреля 2019

    Комментарии (23)
  3. C++ / Говнокод #25558

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    https://habr.com/ru/article/448466/
    
    */
    А последние пару лет набирает популярность boost.hana. Это boost.fusion,
    но с constexpr'ом и лямбдами. Автор hana, Луис Дионе (Louis Dionne),
    используя на полную мощь все возможности новых стандартов, в некотором
    смысле очеловечил метапрограммирование. С помощью hana всяческие
    манипуляции с типами, их кортежами, отображениями, а также компайл- и
    рантайм-работа с ними обрели практически человеческое лицо и читаемый
    вид. Ну, с поправкой на синтаксис C++, разумеется. Вот, например, как выглядит
    универсальный сериализатор структур, написанный с помощью hana:
    */
    
    // 1. Give introspection capabilities to 'Person'
    struct Person {
      BOOST_HANA_DEFINE_STRUCT(Person,
        (std::string, name),
        (int, age)
      );
    };
    // 2. Write a generic serializer (bear with std::ostream for the example)
    auto serialize = [](std::ostream& os, auto const& object) {
      hana::for_each(hana::members(object), [&](auto member) {
        os << member << std::endl;
      });
    };
    // 3. Use it
    Person john{"John", 30};
    serialize(std::cout, john);
    
    /*
    Ну да, структуры приходится описывать особым образом. А кому сейчас легко?
    И тут хочется также отметить библиотеку tinyrefl за авторством Manu Sánchez
    (Мануэля Санчеса). Довольно неплохая попытка принести в мир C++-разработки
    статическую рефлексию без расширения компилятора. Для своей работы библиотека
    требует стороннюю утилиту (cppast), но зато предоставляет довольно удобный доступ
    к информации о структурах, которую можно использовать в процессе разработки
    программы. Преимущество этой библиотеки (по сравнению с другими) в том, что для
    работы с ней не надо использовать «птичий язык», а элементы структур (как и сами
    структуры) можно произвольным образом атрибутировать прямо в исходном коде:
    */
    
    struct [[serializable]] Person {
        std::string name;
        int age;
    };
    template<typename Class>
    auto serialize(std::ostream& os, Class&& object) -> std::enable_if_t<
            tinyrefl::has_metadata<std::decay_t<Class>>() &&
            tinyrefl::has_attribute<std::decay_t<Class>>("interesting"),
        std::ostream&>
    {
        tinyrefl::visit_member_variables(object, [&os](const auto& /* name */, const auto& var) {
            os << var << std::endl;
        });
        return equal;
    }
    
    /*
    Таких примеров можно привести ещё много (или найти на гитхабе или гитлабе).
    Объединяет все эти библиотеки и инструменты одна особенность: значительно
    облегчая жизнь своим пользователям, они имеют такую реализацию, что остаётся
    лишь предполагать, какое количество страданий испытали их разработчики. Достаточно
    заглянуть в реализацию, увидеть забор из ifdef'ов и угловых скобок — и всё понятно.
    Нередко эти реализации делаются на грани возможностей компиляторов. workaround'ы
    банальных ошибок (или особенностей реализации языка конкретной версии конкретного
    компилятора с конкретными флагами) здорово раздувают их код. Желание поддерживать
    несколько стандартов сразу заставляет придумывать зубодробильные конструкции.
    Безусловно, простая попытка реализовать что-нибудь подобное здорово поднимает уровень
    владения языком (иногда — и самооценку). Но в какой-то момент, после многочасовой возни
    с очередной ошибкой, или непроходящим тестом, или крэшем компилятора руки опускаются,
    хочется плюнуть и бросить, ибо силы бороться иссякают.
    */

    Именно поэтому я за гомоиконность

    j123123, 21 Апреля 2019

    Комментарии (50)
  4. Куча / Говнокод #25518

    +2

    1. 1
    https://i.yapx.ru/D3IPu.jpg

    Как я вам?)

    zheurova_elya, 06 Апреля 2019

    Комментарии (27)
  5. Куча / Говнокод #25515

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    In [196]: n= namedtuple('A', ['a', 'b'])(1,2)
    
    In [197]: n.index
    Out[197]: <function A.index>
    
    In [198]: n.count
    Out[198]: <function A.count>
    
    
    In [191]: n = namedtuple('A', ['index', 'count'])(1,2)
    
    In [192]: n
    Out[192]: A(index=1, count=2)
    
    In [193]: n.
    n.count n.index
    
    In [193]: n.count
    Out[193]: 2
    
    In [194]: n.index
    Out[194]: 1

    Это же отсос, да?

    syoma, 06 Апреля 2019

    Комментарии (19)
  6. Куча / Говнокод #25500

    +2

    1. 1
    https://codepen.io/Chokcoco/pen/jJJbmz

    Нихуёво так

    HoBblu_nemyx, 03 Апреля 2019

    Комментарии (22)
  7. 1C / Говнокод #25496

    +2

    1. 1
    2. 2
    Если ЭтоКонецПрихода = 1 Тогда
    	ЭтоКонецПрихода = ЭтоКонецПрихода+1;

    1. Реальный код
    2. Переменная используется как логическая, 0 и 1

    homo, 02 Апреля 2019

    Комментарии (27)
  8. Куча / Говнокод #25486

    +2

    1. 1
    2. 2
    3. 3
    Админ, добавь язык "J".
    Я собираюсь начать учить этот язык и пейсать на нём говнокоды.
    Давайте пейсать в коменты кому ещё что нужно.

    _PHP_, 29 Марта 2019

    Комментарии (42)
  9. C# / Говнокод #25485

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    private bool IsOsTurn()
    {
        if (turn.Text.Equals(oString))
            return true;
        return false;
    }
    
    private bool ADiagonalIsSame()
    {
        if (LeftToRightDiagonalIsSame()) { return true; }
        if (RightToLeftDiagonalIsSame()) { return true; }
        return false;
    }
    
    private bool IsAWin()
    {
        if (ARowIsSame() || AColumnIsSame() || ADiagonalIsSame())
            return true;
        else return false;
    }

    Взято из кода "крестики-нолики", работающем через DataGridView // <- да, это изврат!
    Такое чувство, что автор сука не умеет работать с булевыми значениями.
    Удивлен, что не встретил что-то вроде:

    if (turn.Text.Equals(oString) == true)

    groser, 28 Марта 2019

    Комментарии (6)
  10. C# / Говнокод #25475

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    using big = System.Numerics.BigInteger;
    class Mega
    {
        readonly static Type
            _dbl = typeof(double),
            _str = typeof(string),
            _chr = typeof(char),
            _int = typeof(int),
            _big = typeof(big);
        object o;
        public Mega(object O) => o = O;
        public static Mega operator +(Mega a, Mega b) {
            Type ta = a.o.GetType(), tb = b.o.GetType();
            if (ta == _str || tb == _str)
                return new Mega(String.Concat(a.o, b.o));
            if (ta == _dbl) {
                if (tb == _dbl) return new Mega((double)a.o + (double)b.o);
                if (tb == _chr) return new Mega((double)a.o + (char)b.o);
                if (tb == _int) return new Mega((double)a.o + (int)b.o);
            } if (tb == _dbl) {
                if (ta == _chr) return new Mega((char)a.o + (double)b.o);
                if (ta == _int) return new Mega((int)a.o + (double)b.o);
            } if (ta == _int) {
                if (tb == _chr) return new Mega((int)a.o + (char)b.o);
                if (tb == _int) return new Mega((int)a.o + (int)b.o);
                if (tb == _big) return new Mega((int)a.o + (big)b.o);
            } if (ta == _big) {
                if (tb == _chr) return new Mega((big)a.o + (char)b.o);
                if (tb == _int) return new Mega((big)a.o + (int)b.o);
                if (tb == _big) return new Mega((big)a.o + (big)b.o);
            } if (ta == _chr) {
                if (tb == _chr) return new Mega((char)((char)a.o + (char)b.o));
                if (tb == _int) return new Mega((char)a.o + (int)b.o);
            } throw new Exception("bad operators types");
        } public override string ToString() => o.ToString();
    }

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

    groser, 25 Марта 2019

    Комментарии (2)
  11. 1C / Говнокод #25474

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    Функция ПолучитьЗначениеПеременной(Имя) Экспорт	
    	ИмяПараметраВР = ВРег(Имя);	
    	НайденноеЗначение = Неопределено;	
    	Кэш = Неопределено;
    	ПоместитьВКэш = Ложь;	
    	НайденноеЗначение = Неопределено;	
    	Если НайденноеЗначение = Неопределено Тогда
            //... 
            КонецЕсли;

    Типовая УПП, общий модуль "РаботаСОбщимиПеренменными". Интересно, а бывает ситуация когда после двух присвоений переменной значения, она все таки не неопределено

    FesenkoA, 25 Марта 2019

    Комментарии (8)