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

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
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
class SmoothingModeManager
{
public:
	SmoothingModeManager(Context* context, Gdiplus::SmoothingMode mode = Gdiplus::SmoothingModeHighQuality);
	virtual ~SmoothingModeManager();
	
protected:
	Context* context_;		
};

////////////////////////

SmoothingModeManager::SmoothingModeManager(Context* context, Gdiplus::SmoothingMode mode)
: context_(context)
{
	context_->getCanvas()->SetSmoothingMode(mode);
}


SmoothingModeManager::~SmoothingModeManager()
{
	context_->getCanvas()->SetSmoothingMode(Gdiplus::SmoothingModeNone);
}

Инициализируем класс и контекст со сглаживанием до конца метода.

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

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

    • Для вызова метода написан класс. Их там еще 6 штук, подобных. Имхо, нехорошо.
      Ответить
      • Когда необходимо обеспечить парный вызов метода (сначала с одними параметрами, потом с другими - отменяющими первый вызов), лучше таких вот мелких объектов еще ничего не придумано.
        Налицо не говнокод, а недостаток понимания.
        Ответить
        • По-моему лучше просто быть внимательнее, чем подобные шняги. А то потом непонятно почему начинают отрисовываться части со сглаживанием и без.
          Даже укоротить это до context_->smoothingMode(bool) и то понятнее и удобнее. И пусть низкоуровневые товарищи поправят, но вроде как вызвать метод два раза побыстрее, чем создавать для этого экземпляр класса.
          Ответить
          • Быстрее конечно, память же не надо выделять.
            Хотя это тоже вопрос - если этот класс на стеке, то тут уже надо мерять.
            И еще вопрос в том, как компилятор на это посмотрит. Если соптимизирует - то вообще пофигу.
            Ответить
          • > По-моему лучше просто быть внимательнее, чем подобные шняги.
            Подход неправильный.
            Если развить эту мысль - то зачем вообще использовать языки высокого уровня? Лучше просто потребовать от программиста быть повнимательнее. И пусть в машинных кодах программит.

            > А то потом непонятно почему начинают отрисовываться части со сглаживанием и без.
            Заворачивание функций в класс как раз и гарантирует, что при деструкции объекта в обязательном порядке будет вызвана функция, отключающая сглаживание. В результате неразберихи становится гораздо меньше, чем если требовать от программиста вызвать отключалку сглаживания вручную (то return из функции неожиданный сработал, то эксепшен пришел, то программист в чужом коде не разобрался).

            > И пусть низкоуровневые товарищи поправят, но вроде как вызвать метод два раза побыстрее, чем создавать для этого экземпляр класса.
            Напомню, что речь идет о GUI. О каком-таком "быстрее" мы говорим? 🙂 Пара сэкономленных машинных команд - это ничто.

            Создание экземпляра данного класса на стеке - это две операции:
            1. Сохранить указатель на контекст по адресу в стеке
            2. Вызвать метод по указателю.
            Область памяти под объект выделяется в кадре стека - это бесплатно с точки зрения накладных расходов.

            Итак, от "ручного" вызова функции наш объект отличается фактически только одним-единственным присваиванием. Вы ради этой экономии будете заставлять программистов отслеживать парность вызовов по всему коду?
            Ответить
            • надо смотреть асмовый листинг...
              по моему тут все заинлайнится... а если указатель на контекст сделать константным, то и на стеке ничего не будет...
              и виртуальный деструктор не нужен...
              Ответить
              • Наличие виртуального деструктора - единственный прокол в этом коде. Плюс один лишний пойнтер в классе (на _vtbl).
                Даже вызов деструктора любой более-менее вменяемый компилятор оптимизирует в обычный call.
                Ответить
              • >а если указатель на контекст сделать константным, то и на стеке ничего не будет...
                Кто-то такое сказал? const никогда не влияет на оптимизацию.
                Ответить
                • совсем не влияет? серьезно? а то что это прямой намек компилятору о том что данные меняться не будут??
                  Ответить
                  • Не намёк. const_cast рулит, и данные будут меняться. 😉

                    А вообще приведи хоть один дизасемблерный листинг, где из-за const произошла оптимизация? Небывает такого.
                    Ответить
                    • Хех. Легко:

                      int a = 5;
                      const int b = 5;

                      printf( "%d\n", a + 5 );
                      printf( "%d\n", b + 5 );

                      Ассемблерный код:

                      movl a, %eax
                      addl $5, %eax
                      movl %eax, 4(%esp)
                      movl $.LC0, (%esp)
                      call printf
                      movl $10, 4(%esp)
                      movl $.LC0, (%esp)
                      call printf

                      В первом случае - честное вычисление, во втором - константа вычислена на этапе выполнения.

                      В случае с константными членами класса с С++, конечно, не все так прямолинейно. При создании объекта на стеке под константный мембер будет отведено место. Но тем не менее кое-какие оптимизации возможны и в этом случае (особенно если класс шаблонный).
                      Ответить
                      • В обоих случаях хороший компилятор подсчитает это на этапе компиляции и не будет городить огород из инструкций с включенной оптимизацией. Чем пользуетесь? Что-за говнокомпилятор?
                        Ответить
                        • Я вижу, вопрос с оптимизируемостью const снят. Это радует.
                          В свете этой радости использованный компилятор, уверяю вас, абсолютно не важен.
                          Ответить
                      • как показывает мне моя практика, лучше лишний раз поставить const, чем лишний раз искать вменяемый компилятор...
                        Ответить
                        • Один раз найти хороший компилятор и всё. 🙂
                          А const ставить милионы раз. На лицо не оптимальность принятого решения. 🙂
                          Ответить
                          • новичек? иногда выбор компилятора навязывает платформа... это под виндой их десяток, а под ПС3 он один, и под iPhone - один, и еще бог знает (а консолей и мобильных девайзов сейчас развелось достаточно) где он тоже один...
                            профессионализм как раз заключается в умении писать код а не выбирать компиляторы...
                            Ответить
                            • Для случая, где компиляторы есть - заниматься лишней работой не следует.
                              Ответить
                                • Я не индус. Мне за строчки не платят, а за часы.
                                  ;p
                                  Ответить
                                  • Вместо того, чтобы улучшать качество своего кода, ты переваливаешь ответственность на компилятор. Типа, компилятор должен сам разобраться, где тут что, и оптимизировать соответственно.
                                    Это признак непрофессионализма, как совершенно верно заметил pushkoff. Отказ от расстановки const - это прежде всего отказ от документирования собственного кода. Нет const - нет сведений о том, можно ли изменять значение в данном месте кода или нет. Меньше сведений о коде - больше работы придется сделать тем, кто будет поддерживать твой код после тебя.
                                    Не говоря уже о том, что надеяться на интеллектуальность компилятора там, где он проявлять интеллект вовсе даже не обязан - детский сад.
                                    Ответить
                                    • >где он проявлять интеллект вовсе даже не обязан
                                      Обязан. 🙂
                                      >Типа, компилятор должен сам разобраться, где тут что, и оптимизировать соответственно.
                                      Как признак оптимизации const я раставлять не обязан. Если глупый компилятор соптимизирует мне то, что помечено, как const, а я потом это место const_cast'ом запаганю, то это исключительно глупость компилятора. Если не понятно, то могу привести пример.
                                      >const - это прежде всего отказ от документирования собственного кода
                                      Я где-нибудь сказал, что их не ставлю? Я сказал, что это не имеет отношение к оптимизации.
                                      Ответить
  • Аффтар, хватит называть говнокодом то, в чем ты не разбираешься...
    Ответить
    • И с чего ты взял, что я в этом не разбираюсь? И в чем я еще не разбирался раньше?
      Ответить
      • Потому что ты это постишь... этот код пример того как надо делать (кроме виртуального деструктора)...

        вот твой предидущий пост http://govnokod.ru/2657
        Ответить
  • ну что, говнокодер, помогли исправить баги?
    Ответить

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

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

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


    8