Задать вопрос
brammator
@brammator

Как распланировать классы для приложения а-ля pastebin.org?

Хочу сделать аналог пастебина с такой логикой:

1 Юзер пастит текст
2 Машина определяет один из типов
3 В зависимости от типа выдаётся краткий бриф

Я пишу так (код питоновский, но, думаю, понятен любому программисту):
class Paste(object):
    def save():
        # сериализация и сброс в базу
    def guesstype():
        # угадать тип пасты
    def list():
        # список недавних
    def __str__():
        # показать бриф пасты
class PythonCode(Paste):
    def brief():
        # найти на гитхабе используемые модули, вывести активность коммитов по ним
    def wrapsnippet():
        # ...
class MayakovskyPoetry(Paste):
    def brief():
        # подсчитать слоги в чётных строках
    def printhardcoverbook():
        # ...


Прав ли я? Кое-кто советует "написать всеохватывающую логику с маркерами и в будущем расширять через конфиг, так как код нельзя трогать потому что нельзя и всё тут", но мне кажется, переписать guesstype() базового класса и добавить класс-наследник для нового типа будет проще, логичнее и очевиднее.

Логика деления на типы весьма нетривиальная, с кучей "но если, то" и плохо ложится на "универсальный анализатор"
  • Вопрос задан
  • 2621 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Можно попробовать отдельный класс ресолвер с единственным (?) методом - определить тип текста. Он же может быть и Фабрикой для создания нужного класса. (я использую псевдокод в стиле c#, думаю, также любому программисту будет понятно)
class Paste {
  string Brief() {}
  // other methods
}

class PythonCode : Paste {
  string Brief() {}
}
class MayakovskyPoetry : Paste {
  string Brief() {}
}

class Resolver {
  Paste Guess(string text) {}
}

И использование:
Paste text = Resolver.Guess(userText);
string brief = text.Brief();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
guesstype вообще не должно быть в базовом классе, ибо это не логично. Можно сделать в базовом классе абстрактный метод isMatches (просто пустой метод который выкидывает исключение) и в потомках перегружать его. Этот метод будет определять, подходит ли данный кусок кода под выбранный язык. Хотя еще лучше было бы в отдельный компонент эту логику запихнуть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы