Кресты / Говнокод #5672 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
void CDAMN::ControlDAMNAmount(DWORD newValue)
{
	if(newValue != 0)
		controlDAMNAmount = newValue;
}

DWORD CDAMN::ControlDAMNAmount()
{
	return controlDAMNAmount;
}

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

Запостил: ShuraKotov ShuraKotov, (Updated )

Комментарии (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.
            Ответить
          • Можно. Более того, вот такое работает "правильно"

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

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

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

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

Помни, guest, за тобой могут следить!

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


    8