Часто ли у так бывает, что вы встречаете плохой код и мысленно ругаете автора?
А потом приходите к выводу, что код не так уж и плох, и автора ругали зря… Но осадок-то остался!
В общем, медитировал я давеча перед монитором, и посетил меня такой вот код:
Вслед за этим кодом меня посещает, конечно, Негативная Эмоция. Недоумевание.
Почему надо делить на сто и тут же умножать на сто?
Зачем надо прибавлять сто и делать на сто? Что тут вообще происходит? WTF?
Что получается? Код как бы есть, он как бы работает, то есть обвинить программиста как бы и не в чем. Но в то же время я потратил силы, чтобы в нём разобраться, а самое главное — я произнёс вслух "What The Fuck" что увеличило мою карму на единичку.
Как утверждается в ведических текстах, любой программер может изменить судьбу кода, если в день Бхадра Пурнима откроет для себя священное писание «
Кстати, Шастры рекомендуют ещё и подчистить чутка свою собственную карму, стерев нафик непотребные комментарии и сделав код втрое короче:
Ну вот, теперь карма вашего кода немного очистилась. Но на этом наше обучение jЙоге не законено. Мы лишь в начале Пути. В следующий раз мы рассмотрим, почему нашему коду необходимо ежемесячно исповедоваться и проходить причастие. А лучше — ежедневно, в идеале — даже ежечасно. В древних писаниях этот процесс называется Continuous Integration.
А на сегодня урок окончен.
Резюмируем полученные знания:
Такие дела.
А потом приходите к выводу, что код не так уж и плох, и автора ругали зря… Но осадок-то остался!
В общем, медитировал я давеча перед монитором, и посетил меня такой вот код:
class Graph
{
/**
* retrieve min value for y-axis
*/
public int getYaxisMin() {
int result = getMinAmount();
result = result / 100 * 100;
return result;
}
/**
* retrieve max value for y-axis
*/
public int getYaxisMax() {
int result = getMaxAmount();
result = ( result + 100 ) / 100 * 100;
return result;
}
// Да, это самый настоящий код, написанный не сто лет назад, а в 2010 году,
// и не студентами какими-нибудь, а вполне солидными программистами.
// Так-то!
...
}
Вслед за этим кодом меня посещает, конечно, Негативная Эмоция. Недоумевание.
Почему надо делить на сто и тут же умножать на сто?
Зачем надо прибавлять сто и делать на сто? Что тут вообще происходит? WTF?
Разгадка
В ходе дебага выясняется, что код этот вполне работает. Поскольку речь идёт о целых числах, то при делении на 100 результат округляется, а при повторном умножении на сто получается меньшее число. Например, из 666 получается (666/100) * 100 = 6*100 = 600. То есть значение округляется до ближайшей сотни.Что получается? Код как бы есть, он как бы работает, то есть обвинить программиста как бы и не в чем. Но в то же время я потратил силы, чтобы в нём разобраться, а самое главное — я произнёс вслух "What The Fuck" что увеличило мою карму на единичку.
Карма — космический закон
В Махабхарате есть такое понятие, как карма кода. Карма кода тем чернее, чем больше человек сказало "What The Fuck", глядя на него. Веды говорят, что язык, на котором код будет имплементирован в следующей реинкарнации, зависит от количества WTF'ов, вызванных в прошлой имплементации. Если про код хотя бы раз сказали "What the fuck", то в следующей раз ему уже точно не быть имплементированным на Scala, если сказали пять раз «What the fuck», то ему светит максимум Java, а если 20 раз и больше — то родиться ему в PHP или даже Perl'e.Избавление от кармы
Как же очистить карму своего кода?Как утверждается в ведических текстах, любой программер может изменить судьбу кода, если в день Бхадра Пурнима откроет для себя священное писание «
import org.junit.Test
» и напишет очищающую мантру:public class GraphTest
{
@Test
public void yaxisMinTruncatesToLower100()
{
assertEquals(0, new Graph(48, 415).getYaxisMin());
assertEquals(100, new Graph(100, 415).getYaxisMin());
assertEquals(900, new Graph(914, 415).getYaxisMin());
}
@Test
public void yaxisMaxTruncatesToUpper100()
{
assertEquals(100, new Graph(48, 96).getYaxisMax());
assertEquals(200, new Graph(48, 100).getYaxisMax());
assertEquals(500, new Graph(914, 415).getYaxisMax());
}
}
Кстати, Шастры рекомендуют ещё и подчистить чутка свою собственную карму, стерев нафик непотребные комментарии и сделав код втрое короче:
class Graph
{
...
public int getYaxisMin() {
return getMinAmount() / 100 * 100;
}
public int getYaxisMax() {
return getMaxAmount() + 100 ) / 100 * 100;
}
...
}
Ну вот, теперь карма вашего кода немного очистилась. Но на этом наше обучение jЙоге не законено. Мы лишь в начале Пути. В следующий раз мы рассмотрим, почему нашему коду необходимо ежемесячно исповедоваться и проходить причастие. А лучше — ежедневно, в идеале — даже ежечасно. В древних писаниях этот процесс называется Continuous Integration.
А на сегодня урок окончен.
Резюмируем полученные знания:
Думайте своей головой, не верьте во всякую фигню — и вы достигнете высшей трансцендентальной обители!
Такие дела.