Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Быдлокод? (http://www.flasher.ru/forum/showthread.php?t=146816)

orcpochta 18.11.2010 17:22

Быдлокод?
 
Полный пример:

Код AS3:

var xml:XML = <LOCATIONS>
        <LOCATION ID = "1" STATUS = "OPEN" />
        <LOCATION ID = "2" STATUS = "CLOSE" />
        <LOCATION ID = "3" STATUS = "OPEN" />
        <LOCATION ID = "4" STATUS = "CLOSE" />
        <LOCATION ID = "5" STATUS = "OPEN" />
</LOCATIONS>;
 
var openLocationsID:Vector.<uint> = new Vector.<uint>();
 
xml.*.(@STATUS == "OPEN" && openLocationsID.push(@ID));
 
trace(openLocationsID);
 
//#################################
 
//Output: 1,3,5

Вот эта строчка добавляет в вектор id открытых локаций:

Код AS3:

xml.*.(@STATUS == "OPEN" && openLocationsID.push(@ID));

- быдлокод?)))

i.o. 18.11.2010 18:24

- нет.

orcpochta 18.11.2010 18:38

Цитата:

Сообщение от i.o. (Сообщение 950683)
- нет.

обоснуйте свою точку зрения, пожалуйста))

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

i.o. 18.11.2010 19:14

e4x фильтр это называется, а не костыли)

Котяра 18.11.2010 22:11

Я вообще считаю e4x очень быдлокодным в принципе, но он сокращает запись и в чём-то удобен - остаётся только привыкнуть).
Минус его в абсолютной неООПности, т.к. выражения очень зависят от структуры конкретного XML.
А RegExp вообще брэйнфак, но бывает очень нужен.

orcpochta 18.11.2010 23:19

Цитата:

Сообщение от i.o. (Сообщение 950695)
e4x фильтр это называется, а не костыли)

Костыли в том смысле, что у нас есть выражение @STATUS == "OPEN", по которому производится фильтрация в фильтрующем операторе "()".
К этому выражению добавляется вызов ф-ии, которая никоим боком не относится к фильтрации и возвращаемый ею результат тоже не имеет отношения к фильтрации. Более того, добавляется этот вызов с помощью "логического И", что должно под собой подразумевать фильтрационную осмысленность происходящего, а вот нет...
Т.е. с точки зрения здравого смысла и логики - это полнейший маразм и совершеннейший быдлокод, но зато в один проход и одну строчку)))

Добавлено через 6 минут
Цитата:

Сообщение от Котяра (Сообщение 950763)
Минус его в абсолютной неООПности, т.к. выражения очень зависят от структуры конкретного XML.

Мне кажется он гораздо менее привязан к структуре, чем DOM-овский вариант из AS2, и как-то более абстрактен, что ли...)))

Добавлено через 10 минут
Хотя вы наверно имеете в виду его привязку к именам, а не к структурному скелету, про которую я подумал)))

iNils 20.11.2010 11:14

Если с проверками, то так
Код AS3:

var xml:XML = <LOCATIONS>
        <LOCATION ID = "1" STATUS = "OPEN" />
        <LOCATION ID = "2" STATUS = "CLOSE" />
        <LOCATION STATUS = "OPEN" />
        <LOCATION ID = "4" STATUS = "CLOSE" />
        <LOCATION ID = "5" STATUS = "OPEN" />
        <LOCATION ID = "6"  />
</LOCATIONS>;
 
var openLocationsID:Vector.<uint> = new Vector.<uint>();
xml.*.(hasOwnProperty ("@ID") && hasOwnProperty ("@STATUS") && @STATUS == "OPEN" && openLocationsID.push(@ID));
 
trace (openLocationsID);


f.g.programmer 20.11.2010 13:55

А если нужно будет брать из LOCATION ещё какую-то информацию?
Этот код не читаем (антисоциальный, бескультурный) и крайне не гибкий (грубый, неотёсанный). Его вполне можно назвать быдлокодом.

iNils 20.11.2010 14:05

Цитата:

А если нужно будет брать из LOCATION ещё какую-то информацию?
А если не нужно? Что вы придумываете? Код пишется исходя из задачи. Код вполне читаемый. Гибкий? Гибкость кода определяется не одной строчкой, а набором решаемых задач блоком кода.

f.g.programmer 20.11.2010 17:42

Цитата:

А если не нужно? Что вы придумываете? Код пишется исходя из задачи. Код вполне читаемый. Гибкий? Гибкость кода определяется не одной строчкой, а набором решаемых задач блоком кода.
Пожалуй верно, по одной строчке нельзя судить о коде в целом. Под читаемостью кода вроде как понимается лёгкость его восприятия, а не то, что мы знаем символы из которых он состоит.
Кроме того такая запись
Код:

<LOCATION ID = "5" STATUS = "OPEN" />
подразумевает, что статусов может быть больше двух, а значит в коде может быть существует такая строчка
Код AS3:

xml.*.(@STATUS == "CLOSE" && closeLocationsID.push(@ID));

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

orcpochta 20.11.2010 18:04

>>но в целом это кажется признаком не очень хорошего стиля.

Можно подробней, чем не угодил стиль в случае, когда в каком-то месте программы надо получить список локаций с одним конкретным статусом (даже если статусов более двух)?

Можно, конечно, предположить, что вам не понравилось, что используется магическая строчка "OPEN", а не статическая константа какого-нибудь класса вроде LocationStatus.OPEN, но при чем же здесь как таковая фильтрация xml с занесением результатов в вектор?

iNils 20.11.2010 18:05

А может и не существует. Может разбор вообще ведется после определенного действия пользователя, которого может и не быть.
Это как с if, в зависимости от числа условий, сложность и вложенность if может быть различной.
Не давно была тема про "?:". Там тоже звучали слова про "читабельность". Вот сейчас у меня в проекте есть список действий в switch, больше десятка. Но в зависимости от дополнительного условия, эти действия могут запускаться с разными числами. Типа
Код AS3:

offset = isFace ? 10 : 8;

И если использовать if else, то все это разрастается в высоту и становится не читабельным. Но в повседневной жизни "?:" не очень удобен.

Здесь так же. Решается конкретная задача и для этой задачи такой вид кода допустим. Будет другая задача, можно будет пересмотреть код. Будет третья, тоже может придется. А еще... можно писать комментарий над строкой.

Кстати, написание regexp тоже смахивает на быдлокодерство, предлагаю разбирать строки вручную с помощью if и indexOf :D

f.g.programmer 20.11.2010 21:29

?: и regexp прекрасно справляются со своими задачами не уменьшая читабельности, а иногда и улучшая, если ими не злоупотребляют, как здесь с фильтром.

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

iNils 20.11.2010 21:34

f.g.programmer, вот и фильтр прекрасно справился со своей задачей )
Хотите увидеть настоящий быдлокод?
Код AS3:

function sample (flag:Boolean) {
        if (flag == true) {
                ///
        }
}


orcpochta 20.11.2010 23:03

В чем здесь быдлостность кода?)))

Bgg 20.11.2010 23:09

Видимо стоит писать так:
Код AS3:

if (flag)
//вместо
if (flag == true)

ах да, наверно ещё не указано что функция возвращает void

iNils 20.11.2010 23:11

Цитата:

Сообщение от orcpochta (Сообщение 951162)
В чем здесь быдлостность кода?)))

Вот Bgg верно заметил :)

i.o. 20.11.2010 23:18

быдлокод - это когда выпоняются лишние телодвижения по отношению к коду. С e4x такого нет. Там четко указано, что он должен сделать, пусть и не очень читаемо.
Посетите *****код.ру - поймете, что такое быдлокодерство.

Вот это, например, быдлокод. Как думаете, что здесь вычисляется?
Код AS3:

function midVal(X, Y)
{
    return (Math.max(X, Y) - Math.min(X, Y)) / 2 + Math.min(X, Y);
}

Вообще-то среднее арифметическое. Что достаточно было бы записать как 0.5*(X + Y).

orcpochta 20.11.2010 23:54

Цитата:

Сообщение от iNils (Сообщение 951164)
Вот Bgg верно заметил :)

мне кажется это просто хеллоуворлдство, а не быдлокодерство - код-то доступен в своем осмыслении по самое не могу)))

ir73 21.11.2010 00:12

Код AS1/AS2:

function sample (flag:Boolean) {
        if (flag.toString() == "true") {
                ///
        }
}


iNils 21.11.2010 00:15

Цитата:

Сообщение от orcpochta (Сообщение 951170)
мне кажется это просто хеллоуворлдство, а не быдлокодерство - код-то доступен в своем осмыслении по самое не могу)))

Стоит почитать определение данное i.o., вполне разумно.
Если учитывать, что if работает с логическим результатом в условии, то проверять true на равенство true, это быдлокодерство.

orcpochta 21.11.2010 00:39

Цитата:

Сообщение от iNils (Сообщение 951173)
Стоит почитать определение данное i.o., вполне разумно.
Если учитывать, что if работает с логическим результатом в условии, то проверять true на равенство true, это быдлокодерство.

согласен)))))))

wvxvw 21.11.2010 01:48

Не нужно делать проверки, XML динамический класс, нужно только удостовериться, что обращаемся именно к XML а не куда-то в другое место:
Код AS3:

xml.*.(valueOf().@someAttribute == "foo");

никогда не выкинет исключения.

iNils 21.11.2010 02:03

Цитата:

никогда не выкинет исключения.
Ты точно уверен?:D Я просто проверял код и если атрибут не найден, то исключения были.

orcpochta 21.11.2010 02:06

Исключения он не выкинет, но тогда создается потенциальная опасность получить нулевое значение там, где его нет - и все равно придется делать проверки:

Код AS3:

var xml:XML = <LOCATIONS>
        <LOCATION ID = "1" STATUS = "OPEN" />
        <LOCATION ID = "2" STATUS = "CLOSE" />
        <LOCATION STATUS = "OPEN" />
        <LOCATION ID = "4" STATUS = "CLOSE" />
        <LOCATION ID = "5" STATUS = "OPEN" />
</LOCATIONS>;
 
var openLocationsID:Vector.<uint> = new Vector.<uint>();
 
xml.*.(@STATUS == "OPEN" && openLocationsID.push(valueOf().@ID));
 
trace(openLocationsID);
 
//Output: 1,0,5

Добавлено через 1 минуту
Цитата:

Сообщение от iNils (Сообщение 951193)
Ты точно уверен?:D Я просто проверял код и если атрибут не найден, то исключения были.

С valueOf() не выкинет))

iNils 21.11.2010 02:40

Берем мой код выше, и удаляем проверку на ID
Код AS3:

var xml:XML = <LOCATIONS>
        <LOCATION ID = "1" STATUS = "OPEN" />
        <LOCATION ID = "2" STATUS = "CLOSE" />
        <LOCATION STATUS = "OPEN" />
        <LOCATION ID = "4" STATUS = "CLOSE" />
        <LOCATION ID = "5" STATUS = "OPEN" />
        <LOCATION ID = "6"  />
</LOCATIONS>;
 
var openLocationsID:Vector.<uint> = new Vector.<uint>();
xml.*.(hasOwnProperty ('@STATUS') && @STATUS == "OPEN" && openLocationsID.push(@ID));

Запускаем получаем
Код AS3:

ReferenceError: Error #1065: Переменная @ID не определена.
        at TestXML/init()[D:\_Library\_Work\home.test\_QuickProject\src\TestXML.as:49]
        at TestXML()[D:\_Library\_Work\home.test\_QuickProject\src\TestXML.as:29]


i.o. 21.11.2010 02:56

Цитата:

Сообщение от ir73 (Сообщение 951172)
Код AS1/AS2:

function sample (flag:Boolean) {
        if (flag.toString() == "true") {
                ///
        }
}


Код AS1/AS2:

if (flag.toString().toUpperCase() == ("True").toUpperCase()){
        ///
}

Вот теперь тру-быдлокод :)

iNils 21.11.2010 03:07

Цитата:

Вот теперь тру-быдлокод
Я так понимаю, надо открыть курсы "Хочешь быдлокодером? Мы научим!":D

i.o. 21.11.2010 04:25

ну если найдутся желающие, то почему бы и нет?))

TanaTiX 21.11.2010 11:32

Цитата:

Если учитывать, что if работает с логическим результатом в условии, то проверять true на равенство true, это быдлокодерство.
А как быть в отношении null и underfined?

orcpochta 21.11.2010 11:56

Boolean не может быть null или undefined, а кто может, тот преобразуется в false.

Psycho Tiger 21.11.2010 16:40

Цитата:

Сообщение от iNils (Сообщение 951143)
f.g.programmer, вот и фильтр прекрасно справился со своей задачей )
Хотите увидеть настоящий быдлокод?
Код AS3:

function sample (flag:Boolean) {
        if (flag == true) {
                ///
        }
}


Вот кстати говорил это одногрупнику недавно, смотря в его код. Меня послали :D

TanaTiX 21.11.2010 18:26

Цитата:

Boolean не может быть null или undefined
Я не про Boolean говорил

wvxvw 21.11.2010 20:01

Цитата:

Сообщение от iNils (Сообщение 951193)
Ты точно уверен?:D Я просто проверял код и если атрибут не найден, то исключения были.

точно уверен :)

Цитата:

Сообщение от TanaTiX (Сообщение 951217)
А как быть в отношении null и underfined?

Это странность ECMAScript, вообще два разных "ничего" быть не должно, таким образом, очевидно, пытались решить проблемы свойственные динамическим языкам, но так как динамическая часть в реализации AS3 никакая, то лучше считать, что undefined не существует, или считать null и undefined тождественными. Сразу меньше головной боли :)

iNils 21.11.2010 20:13

Цитата:

точно уверен
см. еще раз

orcpochta 21.11.2010 20:26

ну так вы используйте valueOf() - то, о чем говорил wvxvw и потом я ему отвечал про нулевое значение, бог-весть от куда взявшееся)))

wvxvw 22.11.2010 02:28

Потому что XML динамический, ошибки при обращении к несуществующему свойству быть не может, но просмотр цепочки областей видимости внутри фильтра работает несколько иначе чем вне его: сначала будут просмотрены свойсва XMLя, если вернется undefined, то дальше он будет смотреть аргументы функции, потом локальные переменные, потом поля класса и глобальные переменные. Т.как valueOf() вернет ссылку на самого себя, то мы избежим просмотра всей цепочки (операция уже как бы будет вне фильтра), и если свойства нет, то будет просто undefined.

TanaTiX 22.11.2010 02:41

Цитата:

Это странность ECMAScript...
Спасибо. А я надеялся, что я чего-то не догоняю... Жаль :(

orcpochta 23.11.2010 17:54

Ыыыы...))))))

Код AS3:

room = roomByID[roomIDByUserID[userID]];


Dukobpa3 23.11.2010 21:00

Цитата:

Сообщение от orcpochta (Сообщение 951793)
Ыыыы...))))))

Код AS3:

room = roomByID[roomIDByUserID[userID]];


Ну это не самое страшное:)

Вотъ:
Код AS3:

private var Category:Vector.<Object> = new Vector.<Object>(19, true);
//**********************************
Category[i].table = new Vector.<Vector.<Object>>();
//**********************************
Category[num].table[r] = new Vector.<Object>(5, true);
//**********************************
Category[num].table[r][0] = new TextField();

:cool:


Часовой пояс GMT +4, время: 18:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.