Физз вопрос интервью Базз код


Читать Джеффа Этвуда "почему программисты.. программу?" привело меня к мысли, что почти все решения не будет-то я хочу, чтобы в мой собственный код-база. На Физз Базз программы спецификация от Имран вот что говорит:

Напишите программу, которая печатает числа от 1 до 100. Но для кратно трем печати “шипение” вместо номера и кратные пяти печатать “кайф”. Для чисел, кратных как три и пять принт “FizzBuzz”.

Реализуя свое решение иначе, чем почти все остальные - я хотел бы поставить мое решение пересматривается (как все делают это по-разному должны думать, что мое решение не самое лучшее).

Не могли бы вы пересмотреть мой подход. Это перебор предлагать такое решение? При каких условиях вы бы разбить его на модель и вид? Есть ли проблемы с кодом?

Для начала, я не думаю, что определение агностик язык проблема может полностью описать лучшее решение. В интервью я хотел узнать, задавая вопросы, чего можно ожидать от кодекса Физз взрыва. Вероятные вопросы и мои предположить ответы:

  1. Ли какие-либо изменения, вероятно, будут сделаны в будущем? (например, новые слова, различные иные правила, чем 'шипение' о кратных 3 и "взрыва" на 5). Да

  2. Ли существующей кодовой базы, является процедурным и ОО? ОО

Я решил разделить модель и вид компонентов, которые могут быть легко реализованы различные форматы вывода.

Модель:

class Model_Fizz_Buzz
{
   private $fizzBuzz;

   /** Construct the Fizz Buzz game model.
    *  @param fizzBuzz \Array The list of period => text for the game.  If the
    *  number is a multiple of the period then the text should be used.
    */
   public function __construct(Array $fizzBuzz=array())
   {
      $this->fizzBuzz = $fizzBuzz;
   }

   /** Get the Fizz_Buzz game numbers.
    *  @param start \int The number to start from (defaults to 1).
    *  @param end   \int The number to finish with (defaults to 100).
    */
   public function get($start=1, $end=100)
   {
      $data = array();

      for ($num = $start; $num <= $end; $num++)
      {
         $data[$num] = '';

         foreach ($this->fizzBuzz as $period => $text)
         {
            if ($num % $period === 0)
            {
               $data[$num] .= $text;
            }
         }

         if (empty($data[$num]))
         {
            $data[$num] = $num;
         }
      }

      return $data;
   }
}

Вид:

class View_Text_Lines
{
   /** Write the data values separated by newlines.
    *  @param data \array The data to be written.
    */
   public function write(Array $data)
   {
      foreach ($data as $val)
      {
         echo $val . PHP_EOL;
      }
   }
}

Загрузка может быть:

$fizzView = new View_Text_Lines();

echo PHP_EOL . '-- Standard Fizz Buzz' . PHP_EOL;
$fizzBuzz = new Model_Fizz_Buzz(array(3 => 'Fizz',
                                      5 => 'Buzz'));
$fizzView->write($fizzBuzz->get());

echo PHP_EOL . '-- Three Buzz Bang' . PHP_EOL;
$threeBuzz = new Model_Fizz_Buzz(array(3 => 'Three',
                                       4 => 'Buzz',
                                       5 => 'Bang'));
$fizzView->write($threeBuzz->get(30, 61));


3167
9
задан 18 декабря 2011 в 10:12 Источник Поделиться
Комментарии
2 ответа


Это перебор предлагать такое решение?

Да, я так думаю :-)


При каких условиях вы бы разбить его на модель и вид?

Если вам нужна более чем одна точка зрения. Например, если в спецификации написано, что программа должна иметь возможность записи результатов на экран, в файл CSV/PDF-файл, сетевой сокет, веб-службы и т. д.


Есть ли проблемы с кодом?

Все нормально, просто три вопроса:


  • Именование: я бы переименовать $данные в $результат.

  • Проверка ввода:


    • Что должно произойти, когда $пуск > $конец? (Проверить и бросить исключение.)

    • Что должно произойти, когда $срок - не число? (Исключение в конструкторе.)


  • Модульные тесты не хватает.


Ли какие-либо изменения, вероятно, будут сделаны в будущем?

Я бы не попробовать предсказать его. Если есть какие-то запросы на изменение рефакторинг. Тесты покажут, есть ли регресс или нет. На Программистов.SE есть такие же вопросы по этому поводу:

11
ответ дан 18 декабря 2011 в 03:12 Источник Поделиться

Я согласен, что ваше решение является правильным и любой проверяющий поймет, что ты опытный.

Мое предложение, помимо palacsint, что вы тонкий ваш код немного, чтобы сделать его более читабельным. Я пропила 11 линий от Вам, уменьшая ее длину на 46%, без ущерба для читабельности один бит.

public function get($start=1, $end=100) {
$data = array();

for($num = $start; $num <= $end; $num++) {
foreach($this->fizzBuzz as $period => $text)
if($num % $period === 0)
$data[$num] = $text;
else
$data[$num] = $num;
}

return $data;
}

Конечно, это личное предпочтение, но я надеюсь вдохновить мысль независимо от того, что могло бы вызвать реальное изменение ума или нет.

ПС. К сожалению прокомментировать такой старый вопрос. Я просто хотел разместить свои мысли для тех, кто может откопать это, как я сделал.

3
ответ дан 5 января 2013 в 02:01 Источник Поделиться