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

    +146

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    void CDAMN::ControlDAMNAmount(DWORD newValue)
    {
    	if(newValue != 0)
    		controlDAMNAmount = newValue;
    }
    
    DWORD CDAMN::ControlDAMNAmount()
    {
    	return controlDAMNAmount;
    }

    Автор тот же
    Две функции с одним именем. Одна изменяет внутреннее поле (член класса)- другая возвращает его значение. Использовать приставки get_ и set_ недосуг как-то. Да и называть внутренние переменные класса так, чтобы было понятно, что они не глобальные (с приставкой “m_”) тоже облом. Хайтек-шмайтек…

    Запостил: ShuraKotov, 14 Февраля 2011

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

    • здесь где-то в каментах обсуждался такой код как аналог property...
      Ответить
    • Нормальный код.
      Ответить
    • Первый раз слышу про приставку m_
      Слышал про приставку f и то без подчёркивания
      Ответить
    • > ControlDAMNAmount
      УправлятьПРОКЛЯТЫМКоличеством
      внушает

      this->BloodyIncreaseIt();
      Ответить
    • а мне как раз нравится такая перегрузка. без get\set
      и префикс можно не использовать, если код строго ООП
      Ответить
    • Нормальный код.
      Проверка на ноль разве что подозрительна. Про префикс автор вообще не ясно к чему сказал. Вероят но он прочитал лишь одну книжку по программированию, и там использовался такой стиль.
      Ответить
    • Ээээ... Простите, но использование такого подхода к формированию интерфейса - именно перегруженные функции с параметром и без - это широко распросраненная, хорошо устоявшаяся практика, которая также субъективно более элегантна, чем "дубовые" get/set варианты. Это, конечно, дело вкуса, но назвать это говнокодом за такое никак нельзя. Это во-первых.

      Во-вторых, откуда эта странная манера использовать префиксы типа `m_` на членах класса? Как раз таки именно члены класса прекрасно обходятся без каких-либо префиксов вообще. Может быть Вы еще и методам предлагаете префикс `m_` давать, чтобы с "глобальными" функциями не путать? Нет? Тогда где логика? Если уж Вам нравится префиксная нотация, то префиксы надо давать именно глобальным переменным, ибо они - раритет, а не членам классов.
      Ответить
      • Причина простая. В начале СРР файла декларировано несколько десятков глобальных переменных. Функции-члены класса растянуты на несколько сотен строк. Одна только перегрузка CDialog::OnTimer взяла 1000+ строк. Вот теперь, когда находишься в середине необъятной функции, и пытаешься понять что написано - как отличить член класса от глобальной переменной? У меня такого шестого чувства нет вообще. В таких случаях стандартная приставка "m_" (member) очень помогает
        Ответить
        • Вот то, что "в начале СРР файла декларировано несколько десятков глобальных переменных" - это и есть говнокод. А уж если они все таки декларировали "несколько десятков глобальных переменных", то именно этим глобальным переменным и надо было дать префиксы. Что-то вроде `g_` или `s_` (для статических). Во это и позволит вам отличить "отличить член класса от глобальной переменной".
          Ответить
        • Я бы задал другой вопрос - как отличить член класса от локальной переменной, объявленной в методе, особенно когда у них схожее название и назначение? this-> дописывать к каждому обращению, чтоб даже танкисты поняли? Так писать много.

          А нотации могут быть разными. От мелкомягко-венгерской с её m_ и до подчёркивания в конце идентификатора. А ещё можно вкладывать глобальные константы в namespace Const, а его, в свою очередь, в неймспейс анонимный. Тут уж кто на что учился и кто к чему привык. Но вообще не соблюдать хотя бы минимальных правил именования - это как-то не очень серьёзно.

          Самое страшное - это когда в коде используется этот самый m_, но исключительно по настроению. Две трети членов классов не имеют вообще никакой идентификации. Некоторые начинаются с подчёркивания только из-за того, что в какой-то метод передали что-то с таким же именем (ну почему не сделать хотя бы наоборот?!). Ещё часть валяется в паблике или протектеде и явно представляется создателями как тот самый "аналог проперти", только без какой-либо возможности добавлять следящий код.

          Короче, кодстайл может быть любым. Но он должен существовать и соблюдаться. Иначе - труба.
          Ответить
          • показать все, что скрытоХочу заметить на тему this->. Локальную переменную внутри метода с таким же именем как член класса в С++ сделать нельзя. Это вам не С#.
            Ответить
            • class A
              {
              int m_;

              public:

              A()
              : m_(2)
              {
              int m_ = 3;
              int a = m_;
              int b = this->m_;
              }
              };

              Отлично компилится и работает в 2008-й студии.
              Кроме того, я говорил о схожих именах, а не обязательно одинаковых. Что-нибудь типа index/idx/id, или property/prop.
              Ответить
              • Вы правы. Отстал от жизни :)
                Ответить
                • >Отстал от жизни
                  Это по другому называется. В С++ в этой области ничего не поменялось.
                  Ответить
                  • "по другому" ?
                    Ответить
                    • [Отправил в личку.]
                      Ответить
                      • [SPAM DETECTED]
                        Ответить
                        • Striker, можно на личку помягче антиспам поставить, что-бы избежать ложных срабатываний?
                          Ответить
                          • можно, за наличку.
                            Ответить
                            • Похоже, ещё не все знают, что на говнокоде появилась личка.)
                              Ответить
                              • этого даже я не знаю!
                                Ответить
                                • Самопрограммируемый сайт. Отвлекся ненадолго, хоп, лички появились, капча в дом вернулась с маленькими капченками, может еще какие пряники сахарные выросли на плодородной компостной куче.
                                  Ответить
            • Можно. Более того, вот такое работает "правильно"

              class C {
              int i;
              C(int i) : i(i) {}
              };

              т.е. классная `i` инициализируется из параметра `i`.
              Ответить
    • Ну, здесь уже всё сказали -- нормальный код, такой стиль нередко используется (впрочем, всё же лучше использовать префикс "set" для модификатора). "get" -- это жавизм, так мало кто пишет. Префикс поля класса не не нужен, если оно и так отличается от метода регистром.

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

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