Добавление вспомогательной функции для каждой конкретной страницы в данном случае выглядит как запах кода. Это не всегда может быть проблемой, если вы очень часто говорите «1001» и вам нужен быстрый способ добраться до него. Однако, связывая каждую такую функцию,
read_wall -> second_wall -> third_wall -> fourth_wall
это будет постепенно расширяться и поддерживать это. Может быть, есть базовая функция, которая может извлекать сообщения на стене с учетом любого пользователя и желаемого диапазона.
get_wall_posts(user_id, range)
Чтобы получить первые 100 сообщений на стене, и отображение идентификаторов будет выглядеть примерно так:
first_100_posts = get_wall_posts(some_user, 0...100);
first_100_ids = first_100_posts.map { |post| post['id'] }
Одна из наиболее важных частей рефакторинга - дать хорошие имена идентификаторам. Такие имена, как var
и iterate
, обычно мало что говорят о коде. Похоже, если не хуже, чем комментарии вроде
// increment i by 1
i++;
Последовательность так же важна. Группы методов, которые делают подобные вещи, должны быть названы непротиворечивым образом. read_wall
и second_wall
кажутся мне разъединенными, потому что глагол read
отсутствует в других методах. read_second_wall
звучит как лучшее имя и больше соответствует остальным.
Еще одна вещь, которую следует учитывать при проектировании, это согласованность объектов. В настоящее время некоторые из методов связаны процессом (получение первых 100 или 4 страниц постов), а не их индивидуальной ролью, что делает их зависимыми друг от друга. Вызов second_wall
без вызова read_wall
даст другие результаты, поскольку свойство result
еще не было инициализировано. Это может привести к трудностям в поиске ошибок, потому что есть другое измерение, чтобы отслеживать - используются ли объекты в ожидаемом порядке.
Постарайтесь максимально ограничить побочные эффекты функций. Если возражение должно использоваться в определенном порядке, используйте шаблон state
или что-то подобное, чтобы убедиться в этом.