Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Общее представление конечно есть, нет понимания алгоритмов, формул, путей прохождения событий и т. п.
Нужно рвать зависимости от rand(), time() и NOW() чтобы было что в тестах сравнивать.
Потому что внешнее поведение случайно
Про tolerance не понял, можно по-русски?
ММО RTS
С трудом представляю как это можно тестировать с помощью снимков и логирования запросов и ответов.
if ($device->token != "" && $device->expire <= $now) {
return true;
} else {
return false;
}
return ($device->token != "" && $device->expire <= $now);
Кстати, именно поэтому я пишу if (…) return true else return false. Можно было бы просто return (…), но тогда код было бы чуть сложнее читать, а возвращаемый тип не был бы мгновенно очевиден с первого взгляда.
return ($device->token != "") && ($device->expire <= $now);
return a == b читается намного быстрее. Доводы о том что это сложно воспринять заставляют вспомнить байку про
#define BEGIN {
#define END }Здесь нужно выработать вкус и тонкое чувство наития, подсказывающее, где стоит выделять код, а где нет.
Теперь девайс отвечает на вопрос, можно ли его найти
function isLocatable() {
if ($this->isOurTokenValid() && !$this->isDeviceExpired()) {
return true; // explicitly boolean
} else {
return false;
}
}
Смотря только на это место, всё равно непонятно, что такое токен, как считается Expire, что означает isOurTokenValid
Это только в примере три получившиеся функции идут одна после другой. В реальном проекте они будут раскиданы по файлам
return (boolean)(...); или return boolval(...);, имхо, читается всё же проще, даже если boolval($val) нужно определить ручками как { if ($val) return true; else return false; }. На одно минимум переключение контекста меньше, по-моему, и просто DRY и следование вашим же принципам — одним словом описали что выражение делает :). if ($result === true) {
echo "Positive infinity";
} elseif ($result === false) {
echo "Negative infinity";
} else {
echo $result;
}
SELECT * FROM table JOIN ... WHERE ... AND NOT ...
через переменные с именами вроде a, b, c, и названиями полей таблицы (которое смотришь в sql-дампе или через SHOW TABLE ...
) на неидентифицируемом языке (в смысле человеческом, а не ЯП, но явно не английский и не русский транслит, только по мылам коммитеров можно догадаться что в проекте кроме английского, может быть немецкий, французкий и русский).foreach ($rows as $row) echo "<li>$row['anz']</li>";

function grabConfiguration() {
if ($this->hasOption('configs')) {
return $this->getOption('configs');
} else if ($this->hasOption('config')) {
return [ $this->getOption('config') ];
}
}
$configs = grabConfiguration();
$configs->get("lol");
else {
return null;
}
php > function a() {};
php > var_dump(a());
NULL
php >
else return null; написать. С другой стороны даже python, где принцип «явное лучше неявного» возведён чуть ли не в абсолют, выводит>>> def a():
... pass
...
>>> print(a())
None
>>>
function grabConfiguration() {
if ($this->hasOption('configs')) {
$configs = $this->getOption('configs');
} else if ($this->hasOption('config')) {
$configs = [ $this->getOption('config') ];
} else {
$configs = null;
}
return $configs;
}
cleanupEntriesNewerThanLastDownloadedUnixtime — омг, на этом я сломал моск. Поэтому для внутренних имен обычно использую highly_readable_lower_case_with_undercorescleanupEntriesNewerThanLastDownloadedUnixtime- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers$is_valid_device = $device->token != "";
$device_expired = $device->expire <= $now;
$is_locatable = $is_valid_device && $device_expired;
return $is_locatable;
getOption так, чтобы оставить config, а если нужно разделять единичный и множественный, добавить опцию типа multiple config. Тогда можно будет написатьfunction getConfigs() {
if $this->hasOption ('config') {
$configs = getOption ('config);
$configs->rootFolder = $this->figureOutRootFolder();
}
return $configs;
function isOurTokenValid() {
return ($this->token == "");
}function locator($device) {
// Can we locate the device?
if ($device->token != "" && $device->expire <= $now) {
return false;
}
$modelNotifier = new ModelNotifier($device);
return $modelNotifier->go();
}
Каков тип $device?
Какой тип у $device->expire и $now?
Это точно число или там происходит неявное сравнение дат?
Что возвращает $modelNotifier->go()?
return ($this->token != "");function locator($device) {
if ($device->token != "" && $device->expire <= $now)
return false;
else
return new ModelNotifier($device)->go();
}
Главный принцип хорошего кода