1. C++ / Говнокод #22027

    0

    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
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    Допустим, хочу добавить новый функционал. Что нужно для этого сделать:
    1. Объявить сигнал в интерфейсе интерфейсов (хех). Этот, например, скажет презентеру, что пользователь хочет добавить нового ученика в бд.
    void addStudSIG(StudentData newStudent); 
    2. Объявить одноимённый слот в презентере. Пока всё терпимо.
    void addStudSLOT(StudentData newStudent); 
    3. прихуярить их друг к другу в методе презентера, который отвечает за подписку на сигналы интерфейса
    QObject::connect(uI, SIGNAL(addStudSIG(StudentData)), this, SLOT(addStudSLOT(StudentData)));
    4. реализуем этот слот, реализация состоит из вызова одного метода ("o_" это указатель на "модель", "o" значит "owl", но это не важно)
    o_->addStud(newStudent);
    5. объявляем этот метод в "модели"
    qint32 addStud(StudentData newStudent); // возвращаемое значение это id новой записи в таблице
    6. реализуем, опять вызовом одного метода
    sController_.addItem(newStudent); // для каждой сущности в таблице у меня есть controller, который отвечает за её обработку
    7. Теперь, просто реализуем метод контроллера средствами подключённой ормки, если контроллер есть.
    Если нет, то нужно ещё немного покопипастить своего кода.
    Т.е. "бизнес-логика" размазана по этим контроллерам. Такая архитектура порождает кучу проблем. Копирую имена методов, чтобы создавать методы.
    А если хочешь узнать, что же делает сигнал и тебе не достаточно комментария над ним, нужно идти в глубь на 3 или 4 слоя по вызовам одноимённых
    методов, нихуя не понимая.
    Думал, создать для всех этих объектов общий интерфейс и возможностями Qt Creator, чередуя левую и правую кнопку мыши, частично генерировать
    код. Но это какая-то абстрактная говнокод-фабрика получится. И лапша из перевызова методов не распутается, пусть даже готовиться эта лапша будет
    быстро.
    Думал, вместо внедрения контроллеров в модель, пронаследовать моделью все эти контроллеры и спокойно вызывать методы. Но 4 предка у одного
    класса показалось мне диковатым.
    У меня ощущение, что я как ооп-обезъяна забил трюм ненужными классами и потонул. Может не нужно было явно выносить model, view, presenter
    в классы? Может не нужно было делать классы для контроллеров, а сделать процедуры в отдельном файле? Слишком много "может".
    Я доделал это. Оно злобно рычит, но работает. Но я не хочу каждый раз так задрачивать кнтрлц/кнтрлв. Любой фидбек поможет.
    Заранее спасибо. Прикрепляю заголовочники упомянутых классов, сколько влезет.
    // абстрактный класс, родитель для любого интерфейса
    class UserInterface : public QObject
    {
        Q_OBJECT
    public:
        UserInterface();
        // методы для обновления интерфейса
        virtual void update(данные для обновления интерфейса) = 0;
        // далее куча подобных методов
    
    // сигналы сообщают Presenter-у, что произошли изменения в интерфейсе и передают данные от пользователя на дальнейшую обработку
    signals:
        void addStudSIG(StudentData newStudent);
        // далее куча сигналов
    };
    
    // назвал presenter чертом
    class Daemon : public QObject
    {
        Q_OBJECT
    
    public:
        // подписаться на все события (сигналы) интерфейса пользователя, запомнить указатели на представление и модель
        void listen(UserInterface *uI, Owl *o);
    
    // чтобы узнать, что делает слот, смотри одноимённые сигналы UserInterface
    public slots:
        void getStudsByGradeSLOT(qint32 grade);
        // далее куча слотов
    
    private:
        // указатель на интерфейс
        UserInterface *uI_;
        // указатель на модель (бизнес-логику)
        Owl *o_;
    
        // прихуярить все сигналы uI к слотам Daemon
        void connectSiWithSl_(UserInterface *uI);
    };
    
    // это "модель"
    class Owl
    {
    public:
        Owl();
        ~Owl();
    
        void addStud(StudentData s);
        // далее все возможные преобразования над бд, owl получился что-то вроде фасада над конкретными контроллерами
    
        // создание бд, открытие и закрытие соединения
        void initDb_();
        void close_();
    private:
        // контроллер, отвечающий за создание бд и открытие, закрытие соединения...
        BasicDquestDbController bController_;
        StudentController sController_;
        // далее по контроллеру на каждую сущность базы данных
    };

    Ахой, матросня! Сегодня с вами капитан Кьют и мы будем бороздить просторы говноморей в поисках код-ревью. Пишу сейчас проектец на Qt. Нас на палубе 2 говнокодера. И я близок к тому, чтобы килевать самого себя. У кого есть время и желание, жду от них совета, а те, кто не захочет помочь, сможет поугарать над начинающей c++ макакой.
    В двух словах о проекте: несложное приложение, работает с локальной бд на SQLite через ормку какого-то случайного азиата с гитхаба, интефейс на Qt-шных формах. Архитектурно попытался изобразить MVP. Почему его? Интерфейс нужно было отделить от всего остального. Разработка интерфейса выделилась в отдельную, сложную (и, вроде бы, интересную) задачу. Ею занимаюсь не я. Я отвечаю за "presenter" и "model". Наверное, можно это назвать бекендом. И, чтобы каждый раз не тратить несколько минут на сборку проекта, (все эти ебучие виджеты) я имею заглушку интерфейса. Так вот, братва, я где-то проебался. Нахуярил классов и проебался. Заметил за собой, что при добавлении каждой новой фичи (при готовом скелете архитектуры) снова и снова копирую и вставляю одноимённые функции в одноимённые функции...

    PascalOverlord, 24 Января 2017

    Комментарии (0)
  2. PHP / Говнокод #22026

    −3

    1. 1
    2. 2
    А кто-то на говнокоде искал уязвимости? 
    Или тут настолько всё охуенно написано, что не подкопаться?

    huesto, 23 Января 2017

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

    +2

    1. 1
    https://habrahabr.ru/post/320210/

    Чему учат в ВУЗе на лекциях по безопасности? Думаете там проходят алгоритмы диффи-хельмана или про rainbow tables? Думаете там студенты читают "Прикладную Криптографию" и обсуждают уязвимости?

    А вот и нет. Там учат:
    * SQL injections
    * Генерация HTTP запроса.
    * Чем хэширование отличается от шифрования и ЭЦП, а так же где можно и где нельзя использовать md5

    И еще: "Поскольку студенты в прошлом семестре изучали PHP, то рассматривали эти уязвимости в PHP — с оговоркой на то, что практически всё то же самое справедливо для других языков разработки."

    Я наверное ёбнутый сноб, но мне кажется что тут что-то не так

    barop, 23 Января 2017

    Комментарии (49)
  4. Pascal / Говнокод #22024

    +1

    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
    type
    TReadCoils = array [0..3] of word;
    
    CONST crctab: ARRAY[0..255] OF WORD = (
        $0000, $C0C1, $C181, $0140, $C301, $03C0, $0280, $C241,
        $C601, $06C0, $0780, $C741, $0500, $C5C1, $C481, $0440,
        $CC01, $0CC0, $0D80, $CD41, $0F00, $CFC1, $CE81, $0E40,
        $0A00, $CAC1, $CB81, $0B40, $C901, $09C0, $0880, $C841,
        $D801, $18C0, $1980, $D941, $1B00, $DBC1, $DA81, $1A40,
        $1E00, $DEC1, $DF81, $1F40, $DD01, $1DC0, $1C80, $DC41,
        $1400, $D4C1, $D581, $1540, $D701, $17C0, $1680, $D641,
        $D201, $12C0, $1380, $D341, $1100, $D1C1, $D081, $1040,
        $F001, $30C0, $3180, $F141, $3300, $F3C1, $F281, $3240,
        $3600, $F6C1, $F781, $3740, $F501, $35C0, $3480, $F441,
        $3C00, $FCC1, $FD81, $3D40, $FF01, $3FC0, $3E80, $FE41,
        $FA01, $3AC0, $3B80, $FB41, $3900, $F9C1, $F881, $3840,
        $2800, $E8C1, $E981, $2940, $EB01, $2BC0, $2A80, $EA41,
        $EE01, $2EC0, $2F80, $EF41, $2D00, $EDC1, $EC81, $2C40,
        $E401, $24C0, $2580, $E541, $2700, $E7C1, $E681, $2640,
        $2200, $E2C1, $E381, $2340, $E101, $21C0, $2080, $E041,
        $A001, $60C0, $6180, $A141, $6300, $A3C1, $A281, $6240,
        $6600, $A6C1, $A781, $6740, $A501, $65C0, $6480, $A441,
        $6C00, $ACC1, $AD81, $6D40, $AF01, $6FC0, $6E80, $AE41,
        $AA01, $6AC0, $6B80, $AB41, $6900, $A9C1, $A881, $6840,
        $7800, $B8C1, $B981, $7940, $BB01, $7BC0, $7A80, $BA41,
        $BE01, $7EC0, $7F80, $BF41, $7D00, $BDC1, $BC81, $7C40,
        $B401, $74C0, $7580, $B541, $7700, $B7C1, $B681, $7640,
        $7200, $B2C1, $B381, $7340, $B101, $71C0, $7080, $B041,
        $5000, $90C1, $9181, $5140, $9301, $53C0, $5280, $9241,
        $9601, $56C0, $5780, $9741, $5500, $95C1, $9481, $5440,
        $9C01, $5CC0, $5D80, $9D41, $5F00, $9FC1, $9E81, $5E40,
        $5A00, $9AC1, $9B81, $5B40, $9901, $59C0, $5880, $9841,
        $8801, $48C0, $4980, $8941, $4B00, $8BC1, $8A81, $4A40,
        $4E00, $8EC1, $8F81, $4F40, $8D01, $4DC0, $4C80, $8C41,
        $4400, $84C1, $8581, $4540, $8701, $47C0, $4680, $8641,
        $8201, $42C0, $4380, $8341, $4100, $81C1, $8081, $4040 );
    
     //ôóíêöèÿ íàõîæäåíèÿ êîíòðîëüíîé ñóììû
    function crc16(twoSym:array of Word; size:word):Word;
    var
     i:Integer;
     crc:Word;
    begin
      crc:=$FFFF;
    
      for i:=0 to ((size div 2) -1) do
    
      begin
        crc:=  (crc shr 8) xor CrcTab[(crc and $FF) xor twoSym[i]];
      end;
       Result:=(crc shr 8) or (crc shl 8);
    end;
    function ReadCoils(DeviceAddress: byte; StartingAddress:word; QuantityCoils : word): TReadCoils;
      var
    
        Datagramm: Array[0..3] of Word;
         ToPort: Array[0..5] of word;
    begin
        Datagramm[0]:=TwoBytesToWord(DeviceAddress,$3);
        Datagramm[1]:=TwoBytesToWord(hi(StartingAddress),lo(StartingAddress));
        Datagramm[2]:=TwoBytesToWord(hi(QuantityCoils),lo(QuantityCoils));
         ToPort[0]:=hi(datagramm[0]);
         ToPort[1]:=lo(datagramm[0]);
         ToPort[2]:=hi(datagramm[1]);
         ToPort[3]:=lo(datagramm[1]);
         ToPort[4]:=hi(datagramm[2]);
         ToPort[5]:=lo(datagramm[2]);
         Datagramm[3]:=crc16(toport,12);
    end;

    Вот такими костылями заставляем вычисляться CRC-16 для Modbus в Readcoils

    untitled_001, 23 Января 2017

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

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    if(pEnum > 10){
    	  alert('Я тебе голову сломаю!');
    	  pEnum = 0;
    }

    dm_fomenok, 23 Января 2017

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

    −1

    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
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    static MessageException()
    {
    	kinds = new MessageKindsSet();
    	kinds.AddError("error", "error: <0>");
    	kinds.AddAttention("attention", "warning: <0>");
    	kinds.AddNormalMessage("message", "<0>");
    
    	kinds.AddError("out_of_bounds", "<0> out of <1>..<2>");
    	kinds.AddError("dont_be_here", "Should dont be here!");
    	kinds.AddError("not_found", "<0> not found!");
    	kinds.AddError("not_equal", "<0> not equals <1>");
    	kinds.AddError("equal", "<0> equals <1>, but they must be differrence!");
    	kinds.AddError("equals_null", "<0> is null!!");
    
    	kinds.AddError("excess_item", "Item '<0>' is excess");
    	kinds.AddError("expected_item", "Expected '<0>'");
    	kinds.AddError("unexpected_item", "Encountered unexpected item '<0>'");
    
    	kinds.AddError("wrong_item", "Wrong item '<0>'");
    	kinds.AddError("expected_other_item", "Expected '<0>' but encountered '<1>'");
    	kinds.AddError("unknown_item", "item '<0>' is unknown");
    
    	kinds.AddError("file_not_found", "File '<0>' not found");
    	kinds.AddError("wrong_file_extension", "File '<0>' has wrong extension");
    
    	kinds.AddError("expected_eol", "Expected end of line but encountered '<0>'");
    	kinds.AddError("expected_not_eol", "End of line unexpected!");
    }
    
    
    private void MakeTplParams()
    {
    	Object[] obj = originalTplParams;
    	String[] str = new String[obj.Length];
    	int length = str.Length;
    	for (int i = 0; i < length; i++)
    	{
    		str[i] = !Object.ReferenceEquals(obj[i], null) ? obj[i].ToString() : "";
    	}
    	tplParams = str;
    }
    
    private String CreateText()
    {
    	MakeTplParams();
    	Message kind = kinds.Get(kindName);
    	if (kind != null)
    	{
    		return MakeText(kind.TextTemplate);
    	}
    	else
    	{
    		return MakeDefaultText();
    	}
    }
    
    private String MakeText(String tpl)
    {
    	MakeTplParams();
    
    	if (tpl == "")
    	{
    		return MakeDefaultText();
    	}
    	else
    	{
    		return MakeTextByTemplate(tpl);
    	}
    }
    
    private String MakeTextByTemplate(String tpl)
    {
    	String builder = tpl;
    	int length = tplParams.Length;
    	for (int i = 0; i < length; i++)
    	{
    		builder = builder.Replace("<" + i + ">", (tplParams[i]));
    	}
    	return builder;
    }
    
    private String MakeDefaultText()
    {
    	String builder = "";
    	builder += "[" + kindName + "] :";
    	int length = tplParams.Length;
    	for (int i = 0; i < length; i++)
    	{
    		builder += (tplParams[i]) + "; ";
    	}
    	return builder;
    }

    dm_fomenok, 23 Января 2017

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

    −5

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    if (false !== strpos($status['tag'], 'otlozh')) {
        if (!$_POST['otlozh_date']) $err[] = "Нет даты, до которой отложить";
        else {
            $task = new ConnectionTicket($task_id);
            if ($task->setDateFn($_POST['otlozh_date'])) $tag .= " до {$_POST['otlozh_date']}";
        }
    }

    pahhan, 22 Января 2017

    Комментарии (12)
  8. C# / Говнокод #22019

    −2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    public delegate WriteLineInt32 WriteLineInt32(int value);
    public static WriteLineInt32WriteLine(int value)
    {
    	Console.WriteLine(value);
    	return WriteLine;
    }

    dm_fomenok, 22 Января 2017

    Комментарии (41)
  9. PHP / Говнокод #22018

    0

    1. 1
    <div ...><?php echo 'Blalblabla'; ?></div>

    Можно было бы сказать, что это остатки старого кода, что тут раньше тут была переменная и т.д. Но такое повторяется 9 раз в файле. Неужто всюду забыли сделать правильно?

    gorsash, 22 Января 2017

    Комментарии (9)
  10. PHP / Говнокод #22017

    +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
    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
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    <?php
    namespace app\controllers;
    
    
    use app\models\auth\OrdersModel;
    use yii\helpers\Url;
    use yii\data\Pagination;
    use yii\base\Configurable;
    use yii\web\Linkable;
    use yii\base\Object;
    use Yii;
    require(__DIR__ . '/../models/OrdersModel.php');
    
    class OrdersController extends \app\common\controllers\CabinetBaseController
    {
    	
    	
        public function actionIndex()
        {
            $obj = new OrdersModel();
            $orders = $obj->get_orders(\Yii::$app->user->identity->id);
    
            if(isset($_GET) && !empty($_GET))
                $this->ProductsToCart($_GET['products_data']);
    
          for($i=0;$i<count($orders);$i++){
              if($orders[$i]["status"]==0 )
                  $orders[$i]["status"]="<p style='color: #197b30'>Новый</p>";
              else if($orders[$i]["status"]==1)
                  $orders[$i]["status"]="<p style='color: #000'>Принят</p>";
              else if($orders[$i]["status"]==2)
                  $orders[$i]["status"]="<p style='color: #197b30'>Выполнен</p>";
              else if($orders[$i]["status"]==3)
                  $orders[$i]["status"]="<p style='color: #fe0000'>Удален</p>";
              else if($orders[$i]["status"]==4)
                  $orders[$i]["status"]="<p style='color: #000'>Скопмлектован</p>";
              else if($orders[$i]["status"]==5)
                  $orders[$i]["status"]="<p style='color: #000'>На доставке</p>";
              else if($orders[$i]["status"]==6)
                  $orders[$i]["status"]="<p style='color: #fe0000'>Отменен</p>";
              else if($orders[$i]["status"]==7)
                  $orders[$i]["status"]= "<p style='color: #cec818'>Ожидание оплаты</p>";
    
              $orders[$i]['date']=substr($orders[$i]['date'], 0, strrpos($orders[$i]['date'], ' '));
              $orders[$i]['products_info']=$obj->get_orders_products($orders[$i]['id']);
    
          }
            for($j=0;$j<count($orders);$j++)
                for($k=0;$k<count($orders[$j]['products_info'])-1;$k++)
                    $orders[$j]['products_info'][$k]['product_name'].=", ";
    
    
            $active_order=$obj->GetActiveOrder(Yii::$app->user->identity->id);
    
    
    
            return $this->render('index', [
                "orders" => $orders,
                "active" =>$active_order
            ]);
    
    
        }
    
        public  function ProductsToCart($products){
    
            $time=getdate();
            $orders= new OrdersModel();
            $data['products']=$products;
    
            $data['user_name']=Yii::$app->user->identity->name;
            $data['user_email']=Yii::$app->user->identity->email;
            $data['time']=$time['year'].'-'.$time['mon'].'-'.$time['mday'].' '.$time['hours'].':'.$time['minutes'].':'.$time['seconds'];
            $orders->products_to_cart($data);
            header("Location:". Yii::$app->homeUrl."/cart");
    
        }
    
    }

    На реальном проекте

    C3-PO, 21 Января 2017

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