На стене собирает друзей


Изначально, у меня было все в базовом методе #read_wall(). Я не знаю, что случилось с массива, но когда я попытался:

массив = результат + второй + третий + четвертый. Я остался с данными только оригинальный результат. Поэтому я создал эту рабочую катастрофы. Можете вы пожалуйста помочь мне рефакторинг это?

   # Gets the user's Wall
      def read_wall(fbuserid)
         result ||= graph.get_connections(fbuserid, 'feed')
      end

  def second_wall(fbuserid)
     result ||= graph.get_connections(fbuserid, 'feed')
     second ||= result.next_page
  end

  def third_wall(fbuserid)
       result ||= graph.get_connections(fbuserid, 'feed')
       second ||= result.next_page
       third ||= second.next_page
  end

  def fourth_wall(fbuserid)
        result ||= graph.get_connections(fbuserid, 'feed')
        second ||= result.next_page
        third ||= second.next_page
        fourth ||= third.next_page
   end

  # Collects your friends' wall Posts and puts the IDs into an array
  def get_post_ids(fbuserid)
     x ||= read_wall(fbuserid)
     var = []
     for i in 0..25
        if find_nil(x, [i,'id']).nil? == false
           var << x[i]['id']
        end
     end

     second_wall ||= second_wall(fbuserid)
       for i in 0..25
          if find_nil(second_wall, [i,'id']).nil? == false
             var << second_wall[i]['id']
          end
       end

      third_wall ||= third_wall(fbuserid)
        for i in 0..25
           if find_nil(third_wall, [i,'id']).nil? == false
              var << third_wall[i]['id']
           end
        end

      fourth_wall ||= fourth_wall(fbuserid)
         for i in 0..25
            if find_nil(fourth_wall, [i,'id']).nil? == false
                 var << fourth_wall[i]['id']
            end
         end

      @get_post_ids = var
  end


434
7
задан 28 февраля 2011 в 05:02 Источник Поделиться
Комментарии
1 ответ

def fourth_wall(fbuserid)
result ||= graph.get_connections(fbuserid, 'feed')
second ||= result.next_page
third ||= second.next_page
fourth ||= third.next_page
end

Пару проблем: результат, второй, третий и четвертый - локальные переменные. Это означает, что они не сохраняются после вызова метода закончена, и они никогда не сохраняются после вызова метода завершения. Так:


  1. Вам не нужно установить четвертой переменной, как вы никогда не использовать его в метод, и он не будет доступен после

  2. Вам не нужна ||= как переменные никогда не будет установлен в любом случае.

Т. е. ваш код эквивалентен этому:

def fourth_wall(fbuserid)
result = graph.get_connections(fbuserid, 'feed')
second = result.next_page
third = second.next_page
third.next_page
end

Или просто:

def fourth_wall(fbuserid)
graph.get_connections(fbuserid, 'feed').next_page.next_page.next_page
end

То же самое касается и других стеновых методы.


Дальнейшие ваши fourth_wall способ содержит весь код third_wall метод (который содержит всю second_wall метод и так далее). Это плохой стиль. Просто пусть методы вызывают друг друга:

def fourth_wall(fbuserid)
third_wall(fbuserid).next_page
end

(И опять же на другой стене методами, конечно)


Однако поскольку вы, кажется, только вызов функции (т. е. вы никогда не используете fourth_wall без необходимости использовать third_wall и раньше) кажется намного более разумным, чтобы иметь один метод, который возвращает все на стены:

def four_walls(fbuserid)
first = graph.get_connections(fbuserid, 'feed')
# For more than 4 pages the following should be replaced by a loop
second = first.next_page
third = second.next_page
fourth = third.next_page
[first, second, third, fourth]
end


В вашем get_post_ids способ ты повторяешь один и тот же код в четыре раза. Это опять же плохой стиль. Вы также создает пустой массив, а затем добавляя к его от петли. Это часто (но не всегда) признак плохого кода на Ruby, а также. Также через Х и ВАР как имена переменных-это не очень хорошая идея, и имеющий имя переменной, которая начинается с @get_ просто кажется странным и запутанным.

Я также предполагая, что ваш find_nil метод должен проверить, является ли или стене[я] или стене[я]['идентификатор'] равны нулю. Есть лучшие способы сделать это.

В этом случае вы можете использовать карту на стену, а затем цифры от 0 до 25, чтобы создать массив идентификаторов пользователей для каждой стены, затем с помощью компактной снять шьS и разравнивать , чтобы превратить массива в один массив, а не массив из четырех подмассива. Таким образом, вся ваша get_post_ids метод может быть заменен:

def retrieve_post_ids(fbuserid)
walls = four_walls(fbuserid)
@post_ids = walls.map do |wall|
# Iterate over the first 26 entries in wall
(0..25).map do |i|
wall[i] && wall[i]['id']
end.compact
end.flatten
end


Хотя, если стенапозволяет отрезать похожи на массивы, это было бы лучше:

def retrieve_post_ids(fbuserid)
walls = four_walls(fbuserid)
@post_ids = walls.map do |wall|
# Iterate over the first 26 entries in wall
wall[0..25].map do |entry|
entry && entry['id']
end.compact
end.flatten
end

Если стена не содержит более 26 элементов, вам даже не нужны [0..25] , и вы можете просто использовать хорошо.карте.


Однако мне кажется, что причина, по которой вы нужны и не пропустит проверку на всех было то, что каждая стена содержит 25 элементов и тебя не пропустит в индекс 25 , потому что вы никак не поймете, что диапазоны, используя .. включительно. В этом случае вы можете просто использовать:

def retrieve_post_ids(fbuserid)
walls = four_walls(fbuserid)
@post_ids = walls.map do |wall|
# Iterate over the entries in wall
wall.map do |entry|
entry['id']
end
end.flatten
end

13
ответ дан 28 февраля 2011 в 10:02 Источник Поделиться