1. C# / Говнокод #7562

    +137

    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
    switch (SelItemZoom.Text)
                {
                    case "25%":
                        CRVDoc.Zoom(25);
                        break;
    
                    case "50%":
                        CRVDoc.Zoom(50);
                        break;
    
                    case "75%":
                        CRVDoc.Zoom(75);
                        break;
    
                    case "100%":
                        CRVDoc.Zoom(100);
                        break;
    
                    case "125%":
                        CRVDoc.Zoom(125);
                        break;
    
                    case "150%":
                        CRVDoc.Zoom(150);
                        break;
    
                    case "175%":
                        CRVDoc.Zoom(175);
                        break;
    
                    case "200%":
                        CRVDoc.Zoom(200);
                        break;
                }

    Человек перед этим наверно прочитал про switch.

    Запостил: Ky7m, 17 Августа 2011

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

    • Неужели нельзя было сделать zoom числовым свойством?
      Ответить
      • А вдруг понадобятся единицы измерения: разы, промилле, децибеллы или абсолютный размер после зума?
        Ответить
        • Второе свойство, а лучше - отдельный класс для инкапсуляции размеров.
          Ответить
      • Видимо думать над преобразованием ##% в ## было не в досуг, и слепили свитч. Может оно тут и оправдано.

        А вообще свитч обладает какой-то особой притягательной силой. Что им только не содят.
        Приходилось видеть даже "эмуляцию" полиморфизма в ООП - языке - тупо в базовый класс запихали свитч с проверкой this на тип и выполнением действий в методе в зависимости от этого типа
        Ответить
        • > в базовый класс запихали свитч с проверкой this
          За такое надо сажать на кол. Или хотя бы в неоплачиваемый отпуск до прочтения GoF
          Ответить
          • Зачем так жестоко? Уволить, записать в трудовую книжку, что уволен по несоответствию и дело с концами.
            Ответить
            • Ваш вариант ещё более жесток...
              Ответить
            • Кстати, рассматривается законопроект об упразднении трудовых книжек в РФ. Кому это вдруг понадобилось?
              Ответить
        • Дайте, дайте на это посмотреть...
          Ответить
          • Как известно, enum — это не просто типизированный набор уникальных значений. У enum-ов могут быть методы, перегруженные для каждого значения. А можно поступить наоборот — один метод, но внутри switch по this. Плюс этого подхода — некоторая экономия размера, ведь в противном случае для каждого значения создавался бы отдельный класс. Главный минус отсутствует — enum нерасширяем и всё находится в одном месте.
            Ответить
            • отсыпь
              Ответить
            • >У enum-ов могут быть методы, перегруженные для каждого значения.
              Можно пример?
              Ответить
              • Не в C++.
                Ответить
                • Вы про хаскел?
                  Ответить
                  • Java, ёпт.
                    Ответить
                  • Про Java.
                    enum Blubbs
                    {
                    	FOO
                    	{
                    		public int blabla(Item item)
                    		{
                    			return 0;
                    		}
                    	},
                    	BAR
                    	{
                    		public int blabla(Item item)
                    		{
                    			return item.getZu();
                    		}
                    	},
                    	BAZ
                    	{
                    		public int blabla(Item item)
                    		{
                    			return item.getQua() * 2;
                    		}
                    	};
                    
                    	public abstract int blabla(Item item);
                    }

                    vs
                    enum Blubbs
                    {
                    	FOO, BAR, BAZ;
                    
                    	public int blabla(Item item)
                    	{
                    		switch(this)
                    		{
                    			case FOO:
                    				return 0;
                    			case BAR:
                    				return item.getZu();
                    			case BAZ:
                    				return item.getQua() * 2;
                    		}
                    	}
                    }

                    Первый способ кошернее, второй лаконичнее (и меньше байткода). А теперь представим, что значений десяток и методов несколько.
                    Ответить
                    • Интересно, как первый метод реализован?
                      Ответить
                      • Для каждого значения энума заводится внутренний анонимный класс (с именем типа Blubbs$1), производный от класса энума и с переопределёнными методами. Значения энума становятся (единственными) экземплярами этих классов.
                        Ответить
                    • В варианте со свитчем ошибка =(
                      Ответить
                      • Где?
                        Ответить
                        • А вот что будет если this - ни один из перечисленных вариантов? Нам с вами ясно, что такого быть не может, а вот компилятору никак не допереть (
                          Ответить
                          • Думал, что он допрёт. В других случаях допирает.

                            Ну что ж, добавить throw new AssertionError() не трудно.
                            Ответить
                            • А можно default?
                              Ответить
                              • Не стоит. Риск забыть добавить ветку при расширении энума.
                                Ответить
                                • Ну, мне как студентоте, легче добавить не забыть ветку, нежели с моим-то опытом кидать исключение. Боюс-с не доброшу-с :D
                                  Ответить
    • CRVDoc.Zoom(int.Parse(SelItemZoom.Text.R eplace("%", "")));

      Фиксед?
      Ответить
      • Функционал отличается от предыдущего. Так будет точнее:
        int zoom = int.Parse(SelItemZoom.Text.Replace("%", ""));
        if ((zoom >= 25) && (zoom <= 200) && !(zoom % 25))
          CRVDoc.Zoom(zoom);
        Ответить
        • Я думаю, что все возможные значения, которые может принимать SelItemZoom.Text, перечислены в свиче. Ну да детали. :)
          Ответить
        • не забываем про границы:
          1. if zoom < 25 zoom = 25;
          2. if zoom > 200 zoom = 200;
          Ответить
          • Во-первых, где этот момент в оригинальном коде?
            Во-вторых, что делать с промежуточными значениями?
            Ответить
            • 1. optional
              2. выравнивать по ближайшей границе.
              Ответить
        • этож не функционал
          Ответить
    • Теперь так можно и на Java.
      Ответить
      • джаву начинают пихать теми же сахарными стероидами, на каких вырос С#
        скоро код на джаве тоже надо будет разбирать, как клинопись, видя что-то вроде @a++-b()??!c, в голове генерируя незасахаренный код
        Ответить
        • Это вы говорите о языке с исключениями и сборщиком мусора?
          Ответить
          • он хотя бы до 6ой версии был почти без сахара
            Ответить
            • До 5-й версии им можно было пользоваться только под дулом пистолета (ну или если склонность к мазохизму).
              Ответить
              • Почему? Просто интересно почитать =) Сам столкнулся с ЯП на 6й версии
                Ответить
                • Найдите какой-нибудь проект на старой Яве и посмотрите.

                  1. Нет foreach, любая итерация превращается в трехэтажную конструкцию. Да ещё и итерирование по массиву и списку записывается по-разному. Дополнительная переменная на цикл — индекс, итератор или энумератор.

                  2. Нет генериков, все коллекции безтиповые, при любом обращении приходится явно приводить к нужному типу (и ещё скобочек нужных расставить). Кроме громоздкости, это плохо влияло и на статический контроль типов.

                  Остальное — просто приятные мелочи.
                  Ответить

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