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

    +72

    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
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    public void load()
    	{
    		for(Language lang : Language.VALUES)
    		{
    			strings.put(lang, new HashMap<String, String>());
    
    			File f = new File(Config.DATAPACK_ROOT, "data/string/strings_" + lang.getShortName() + ".properties");
    			if(!f.exists())
    			{
    				log.warn("Not find file: {}", f.getAbsolutePath());
    				continue;
    			}
    
    			LineNumberReader reader = null;
    			try
    			{
    				reader = new LineNumberReader(new FileReader(f));
    				String line = null;
    
    				while((line = reader.readLine()) != null)
    				{
    					if(line.startsWith("#"))
    						continue;
    
    					StringTokenizer token = new StringTokenizer(line, "=");
    					if(token.countTokens() < 2)
    					{
    						log.error("Error on line: " + line + "; file: " + f.getName());
    						continue;
    					}
    
    					String name = token.nextToken();
    					String value = token.nextToken();
    					while(token.hasMoreTokens())
    						value += "=" + token.nextToken();
    
    					Map<String, String> strings = this.strings.get(lang);
    
    					strings.put(name, value);
    				}
    			}
    			catch(Exception e)
    			{
    				log.error("Exception: " + e, e);
    			}
    			finally
    			{
                    try
                    {
                        reader.close();
                    }
                    catch(Exception e)
                    {
                        log.error("Cannot close reader", e);
                    }
    			}
    		}
    
    		log();
    	}

    java.util.Properties? Нет, не слышали :)

    Запостил: EvSpirit, 22 Ноября 2012

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

    • Парсить вручную стандартный properties - действительно странное занятие... Но вообще properties обладает таким недостатком, что русские буквы там хранятся в аццкой кодировке, и если вдруг пришлось их редактировать, то начинается жуткая путаница. Поэтому я в некоторых случаях делаю полностью свой формат, где всё в обычном UTF-8.
      Ответить
      • http://ideone.com/tc8uhl
        Ответить
        • В натуре, работает... Гм... А чего ж они тогда... Весь этот геморрой с native2ascii... Ну ладно, может, пережитки прошлого... На будущее буду иметь в виду :-)
          Ответить
    • Причины которые побудили автора написать свой парсер мне неизвестны.
      Но сам код неплох. Говна в нем не вижу, вовсе.

      И еще. Ваш расчудесный java.util.Properties не закроет reader сам. А 99.5% используют его именно так.
      Ответить
      • Абсолютно согласен, но, как говорится, под каждую задачу нужен правильный инструмент. Вы верно подметили, что без остального кода тяжело представить общую картину, но все же я его видел и сложилось впечатление, что это, скорее, от незнания.

        А про HashMap vs. HashTable - действительно важный момент, но опять же - смотря какая задача)
        Ответить
        • Единственное что мне реально тут не нравится - модифицируется некий strings, который должен приходить параметром и/или возвращаться из метода, но м.б это класс-обертка для свойств - хз.
          Велосипед не есть плохо, когда собран хорошо и качественно и автор четко понимает зачем он делал так.
          Вон, ссылка Романа ниже, там реально бесполезный треш.
          Ответить
          • К этому замечанию добавлю еще одно - мы уже выше упомянули о HashMap vs. HashTable, но тут надо помнить о синхронизации, HashMap не синхронизирован. Функция load(), в свою очередь, вызывается и при перезагрузке properties-файла, т.е. это потенциальная ошибка.

            Без велосипедов, увы, порой не обойтись, но, делая свой велосипед, нужно быть уверенным, что колеса у него не получатся квадратными)
            Ответить
    • И еще одно - Properties - это сраный Hashtable<Object,Object>. А тут HashMap <String, String>.
      Хотя без остального кода понять говно это, или наоборот - хорошо и правильно - нельзя.
      Ответить
    • {@see http://govnokod.ru/11354}
      Ответить
    • StringTokenizer и LineNumberReader, да еще с Enumeration - древнее жабье говно, с какой-то радости поперченное генериками.
      По-моему, тут автор вообще хотел локализацию, а это да, Properties и ResourceBundle.
      Ответить
      • >StringTokenizer и LineNumberReader
        Ни один из них не deprecated
        >да еще с Enumeration
        Это зашито в StringTokenizer.
        Ответить
        • да, за это время более удобных способов не появилось, угу
          Ответить

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