Как организовать модели Rails, которые являются слишком толстыми?

Предупреждение: Деление на ноль

Предупреждающее сообщение «Подразделение на ноль» является одним из наиболее часто задаваемых вопросов среди новых разработчиков PHP. Эта ошибка не вызовет исключения, поэтому некоторые разработчики иногда будут подавлять предупреждение, добавляя оператор подавления ошибок @ перед выражением. Например:

$value = @(2 / 0);

Но, как и при любом предупреждении, наилучшим подходом было бы отслеживать причину предупреждения и разрешать его. Причина предупреждения будет происходить из любого экземпляра, где вы пытаетесь разделить на 0, переменную, равную 0, или переменную, которая не была назначена (поскольку NULL == 0), потому что результат будет «неопределенным».

Чтобы исправить это предупреждение, вы должны переписать свое выражение, чтобы проверить, что значение не равно 0, если оно есть, сделать что-то еще. Если значение равно нулю, вы не должны делиться или изменять значение на 1, а затем делить так, что деление приводит к эквиваленту того, что он разделен только дополнительной переменной.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Вопросы, относящиеся:

29
задан Jaryl 17 August 2011 в 15:58
поделиться

4 ответа

Я не сделал бы этого по нескольким причинам.

Первый Вы нарушаете предположение, что вещи будут состоять в том, где они должны быть, который является, вероятно, самой большой премией к направляющим во-первых. Новый человек может идти на Ваш проект и переместиться по нему довольно легко, если Вы засовываете образцовый материал в свою модель. При получении по запросу его, Вы просто добавляете задержку и некоторый беспорядок особенно, если единственная логика для удаления чего-то к модулю должна уменьшить образцовый размер.

112-секундный Вы почти ничего не получаете от него, и Вы теряете что-то. Размер файла не имеет значения в эти дни, когда почти все редакторы и IDE упрощают боль навигации больших файлов. Перемещение материала к модулю на самом деле устраняет часть этой современной простоты и потребует, чтобы Вы и Ваши коллеги или будущие специалисты по обслуживанию перешли вокруг еще нескольких файлов при работе над одной моделью.

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

6
ответ дан srboisvert 28 November 2019 в 01:49
поделиться

Ну, я не сказал бы, что любой из Вас неправ поместить все в одну модель, но я думаю, что это также довольно допустимо, чтобы быть в состоянии разделить различные проблемы. Это - компромисс в очень наименьшее.

И я отправляю ответ на свой собственный вопрос, поскольку я нашел направляющие Способом сделать просто что: http://github.com/jakehow/concerned_with

[еще 114] информация может быть найдена здесь: http://m.onkey.org/2008/9/15/active-record-tips-and-tricks

3
ответ дан Jaryl 28 November 2019 в 01:49
поделиться

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

, Например, при создании канала действия Facebook-esque, и все должно генерировать "события", тогда возможно, Вы хотели бы переместить это поведение "Eventable" в модуль, который, когда включено, определяет ассоциации/проверки/и т.д. Я сказал бы, что подход на самом деле улучшит ясность Вашего кода, начиная с ручного определения, что те ассоциации везде не почти так же выразительны как объявление чего-то как Eventable, и при этом это не как безопасное (Вы копировали бы логику в наборе мест, и когда логика изменяется, Вы знаете остальных...)

, В целом, хотя, я сказал бы, бросают большой взгляд на Вашу объектную модель. В Вашем наборе тестов, если Вы замечаете, что все Ваши тесты требуют большой установки, которая может быть хорошим индикатором, что Вы пропускаете что-то в своей объектной модели. Снова, хотя, некоторый пример кода был бы большим.

2
ответ дан nakajima 28 November 2019 в 01:49
поделиться

Модули звучат разумными. Я не извлек бы вызовы метода (проверки, обратные вызовы, плагины и т.д.) в модули, тем не менее, я ограничу извлечение своими собственными методами.

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

0
ответ дан August Lilleaas 28 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

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