1. Java / Говнокод #7590

    +73

    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
    if(block == Block.blockDiamond || block == Block.oreDiamond)
            {
                return toolMaterial.getHarvestLevel() >= 2;
            }
            if(block == Block.blockGold || block == Block.oreGold)
            {
                return toolMaterial.getHarvestLevel() >= 2;
            }
            if(block == Block.blockSteel || block == Block.oreIron)
            {
                return toolMaterial.getHarvestLevel() >= 1;
            }
            if(block == Block.blockLapis || block == Block.oreLapis)
            {
                return toolMaterial.getHarvestLevel() >= 1;
            }
            if(block == Block.oreRedstone || block == Block.oreRedstoneGlowing)
            {
                return toolMaterial.getHarvestLevel() >= 2;
            }

    Из сорцов майнсрафта.
    Нахрена делать из двух ifов пять?!

    Запостил: RaZeR, 19 Августа 2011

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

    • Когда смотрю на такие портянки невольно начинаю думать о Data Driven Code.
      Ответить
      • какой-нибудь внешний конфиг в ресурсах идеально подошёл бы для таких вещей...
        Ответить
    • >Нахрена делать из двух ifов пять?!
      Чтобы потом было легче вносить изменения.
      Ответить
      • Угу, раз уж всё равно хардкод - так хотя бы логическая группировка есть... Практика показывает, что практически каждый раз, когда я создаю большой иф с кучей условий - их комбинации упорно вылазят боком до тех пор, пока код не переписан как-нибудь по-другому.
        Ответить
      • Ну не знаю. Лично мне кажется, что от этого читабельность страдает (впрочем, от двух ифов тоже, не отрицаю).
        Тут как вариант можно было бы сделать поле HarvestLevel у блока и потом просто сравнивать его с HarvestLevel'ом кирки.

        Либо, как вариант "легче вносить изменения":
        List<Block> harv1 = new ArrayList<Block>();
        List<Block> harv2 = new ArrayList<Block>();
        bool harvestable = false;
        <...>
        harv1.add(Block.blockSteel);
        harv1.add(Block.oreIron);
        <...>

        Iterator it = harv1.iterator();
        while (it.hasNext())
        {
        if (block == (Block)it.next())
        {
        if (harvestLevel >= 1) harvestable = true;
        }
        }

        <...>
        и т.д.
        Либо конфиг, как сказал Kirinyale.
        Ответить
        • Уродство. Если уж нельзя у Block завести поле HarvestLevel, то следует использовать IdentityHashMap<Block,Integer> (или EnumMap<>) и простой get. Заполнить его хоть из конфига, хоть захардкодить.

          Если конфиг не нужен, не планируется расширение или изменение в динамике, то хорошо подойдут enum-ы.
          Ответить
    • такая уж оптимизация...
      Ответить
    • А как называется метод, который содержит данный блок кода?
      Ответить
    • А где Вы взяли сырцы minecraft?! Заранее спасибо
      Ответить
    • Так вот почему он у меня не запускается!
      Ответить
    • показать все, что скрытоvanished
      Ответить

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