1. Ruby / Говнокод #13027

    −89

    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
    def set_path
          if name && (!path || path == "/")
            self.path = self.parent.present? ? "#{self.parent.path}/#{name}" : "/#{name}"
          elsif !new_record? && name && path && name_was != name
            parts = path.split("/")
            parts.pop
            self.path = [parts.join("/"), name].join("/")
          elsif !new_record? && name && self.parent_id_changed?
            self.path = self.parent.present? ? "#{self.parent.path}/#{name}" : "/#{name}"
          elsif new_record? && name && path
            self.path = [path, name].join("/")
          end
    
          if path && self.parent.blank?
            parts = path.split("/")
    
            self.name = parts.pop
    
            parent_path = parts.join("/")
            if parent_path.blank? || parent_path == "/"
              self.parent = nil
            else
              possible_parent = site.asset_folders.find_by_path(parent_path)
              self.parent = possible_parent.present? ? possible_parent : self.class.create(path: parent_path, site: site)
            end
          end
          true
         end

    Как не нужно работать с путями в Rails-приложении. Это и еще примерно 500 строк было заменено на 11 строк кода, включая пустые.

    Запостил: whitequark, 20 Мая 2013

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

    • феерично. и эпично.

      кто писал?
      Ответить
    • Не верю. Покажите изначальные 500 строк и то, во что они превратились.
      Ответить
      • 500 строк я померял по диффу.

        Там была очень, очень плохая эмуляция древовидной файловой системы на Ruby — вся работа с путями выглядела вот так и работала иногда — плюс раздача статики, где каждый хит проходил через базу данных, которую я заменил на одну функцию, собирающую дерево из симлинков, и nginx.

        Из не попавшего в фрагмент: например, сломанная эмуляция транзакций при помощи поля в базе и исключений. При том, что можно было просто взять и написать транзакцию *facepalm
        Ответить
        • Ну так постите, что же вы, вместе посмеёмся.
          Ответить
          • http://govnokod.ru/13029, например
            Ответить
          • Сразу видно человека, которому не доставалось в наследство проектов от индусов. У меня вот тут тоже досталось... На простенький, в общем-то, функционал блогосоциалки наделано почти 600 таблиц в базе и 200 с хвостком контроллеров ("типа MVC" - там отдельная песня) в коде. *facepalm* Тут, конечно, для сравнения с автором в 11 таблиц не влезет... Но всё равно больше полусотни вряд-ли выйдет, если придумаем как это всё проверить и данные юзеров сохранить...
            Я это к чему - там тоже 1000-строковые модели легко (если поймёшь что они делать должны:)) сокращаются до 30-50 строк включая добавление DOC-комментов.
            Ответить
            • Ладно бы индус, здесь человек даже программировать (в теории) умел. Не абы кто.
              Ответить

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