Пример индусского кода (С#)
Пример 1:
- Код: Выделить всё
uint i;
…
if (i.ToString().Length == 1)
{
...
}
Не сразу можно понять, что в этом коде просто-напросто выполняется проверка i < 10. Алгоритм достаточно прост: выполняется преобразование i в строку, после чего вычисляется ее длина. Если число больше 9, то его десятичная запись содержит больше одного символа. Отрицательные числа переменная типа uint содержать не может. Проверку проходят лишь числа от 0 до 9.
Алгоритм ресурсоемок, неочевиден и не поддается сопровождению даже теоретически.
Пример 2:
- Код: Выделить всё
double rest(float a, float b)
{float res=a*b;
for (int i=0; i<999999999; i++)
if (i<=res && i+1>res) {res = res-i; break;}
return res;
}
Далеко не сразу можно понять, что этот код выделяет дробную часть произведения a*b. кроме того, функция выдаст ошибочное значение при a*b>999999999 или a*b<0. Также зависимость времени выполнения от величины целой части тоже не радует.
Пример 3:
- Код: Выделить всё
bool IsNumber (string str)
{
return (str.Replace ("0", "").Replace ("1", "").Replace ("2", "").Replace ("3", "").Replace ("4", "").Replace ("5", "").Replace ("6", "").Replace ("7", "").
Replace ("8", "").Replace ("9", "").Length == 0);
}
Хотя в данном случае, вообще говоря, алгоритм вполне очевиден, не менее очевидно и то, что для его выполнения конструктор класса string будет вызван не менее десяти раз, со всеми вытекающими из этого последствиями. И всё только потому, что какому-то индусу было лень придумать менее ресурсоёмкую альтернативу.
Пример 4:
- Код: Выделить всё
bool value;
…
if (value.ToString().Length == 4)
{
...
}
В этом примере проверка истинности значения логической переменной производится с помощью длины её текстового представления. Если длина равна четырём („true“), значение истинно.
По рассказам программистов, именно код, который писали индусы (жители Индии), отличается подобными «гениальными» решениями в области алгоритмизации и программирования. Конечно, это не значит, что все остальные нации безгрешны в этом отношении. Cуществует так же версия, что в Индии индусы не пишут индусский код, а поют и танцуют его
Kитайский код
Kитайский код – стиль написания программного обеспечения, нарушающий принцип НПС ("Не Повторяй Себя"). Китайский подход к программированию требует эксплицитного отказа от циклов, локальных переменных, любых процедур и условных выражений, а так же использования технологии cut-and-paste чуть менее, чем везде.
Возьмем, допустим, следующий кусочек программы на C:
- Код: Выделить всё
int arr[10];
int i;
for (i = 0; i < 10; i++) {
arr[i] = 0;
}
Типичный программист в китайском стиле напишет это так:
- Код: Выделить всё
int a0 = 0;
int a1 = 0;
int a2 = 0;
int a3 = 0;
int a4 = 0;
int a5 = 0;
int a6 = 0;
int a7 = 0;
int a8 = 0;
и в дальнейшем будет использовать a0, a1, a2, a3, a4, и т.д. Например, вместо
- Код: Выделить всё
if (x < 10) arr[x] = x;
будет
- Код: Выделить всё
if (x == 0) {
a0 = x;
}
else if (x == 1) {
a1 = x;
}
else if ( x == 2) {
...
}
Пример #1, приведенный выше
- Код: Выделить всё
uint i;
…
if (i.ToString().Length == 1)
{
...
}
приверженец китайской методы перепишет так:
- Код: Выделить всё
if (i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9) {
// произвести еще одну бессмысленную операцию
}
В то время как суть индусского метода заключается в как можно более полном затуманивании предназначения программного продукта, китайский код зачастую поражает и даже отупляет простотой и брутальной прямолинейностью подхода, что характерно для китайской инженерии в целом. С другой стороны, нельзя не отметить, что подобные технологии позволяют максимальным образом трудоустроить население и приводят к сокрушительным победам в социалистических соревнованиях по количеству написанных строчек.
Если программист в китайском стиле и напишет процедуру, то вероятность того, что результат ее деятельности будет совершенно бесполезным, стремится к единице.


