metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-07-12 02:00 pm

Тяжелый ООПшный майндфак

В .NET, во всяком случае в 2.0 и раньше есть одна вещь, которая садит на коня просто нечеловечески. Это то, что куча функций обработки строк является методами экземпляра класса String. А не статическими методами класса. Вроде бы мелочь, подумаешь, какая разница - писать s=s.ToLower(); или s=string.ToLower(s);
А вот хрен. С добавлением того факта, что строка это объект, и она может быть null, и использованием этого null как маркера "функция вернула хрень" в куче мест фреймфорка мы получаем тот геморрой, что перед каждым вызовом s.ToLower() приходится впихивать if(!string.IsNullOrEmpty(s)) или как минимум if(s!=null).

Т.е. вместо такого:
if(String.ToLower(Path.GetExtension(fn))==".wav") {
}

приходится писать такое:
string ext = Path.GetExtension(fn);
if(!string.IsNullOrEmpty(ext))
ext = ext.ToLower();
if(ext==".wav"){
}


Вот этот ООПшный фетишизм "все - объект" и отсутствие глобальных или хотя бы статических функций для простейших вещей просто бесит.

[identity profile] kkirsanov.livejournal.com 2009-07-12 11:16 am (UTC)(link)
В питоне встречается похожее:

Если есть список строк: a=['a', 'b', 'c'] и хочется их обеденъить в одну строку 'abc' то нужно писать "".join(a)

"" - создаст пустую строку для которой уже будет вызываться join

[identity profile] rssh.livejournal.com 2009-07-12 11:32 am (UTC)(link)
В С# вроле элвис есть. Должон немного помогать

[identity profile] http://users.livejournal.com/_windwalker_/ 2009-07-12 11:33 am (UTC)(link)
Кстати, а в .NET нет .equalsIgnoringCase() ?
Тогда бы код ребе превратился бы в вот такой:
string ext = Path.GetExtension(fn);
if (".wav".equalsIgnoringCase(ext)) {
//foobar!
}

[identity profile] metaclass.livejournal.com 2009-07-12 11:37 am (UTC)(link)
Есть, но он там с извращениями тоже. И в switch его не засунешь.

[identity profile] vp.livejournal.com 2009-07-12 12:57 pm (UTC)(link)
Вообще я очень слабо понимаю, что движет проектировщиками, когда не выносят такие вещи на уровень статических членов класса.. Это ж банально нудобно. Я понимаю, что тотальное ООП и все такое, но должна ж быть грань.

[identity profile] metaclass.livejournal.com 2009-07-12 01:12 pm (UTC)(link)
Фетишизм ими движет. Им там в микрософте запрещают одевать на работу кожано-латексную одежду и приносить своих любимых японских кукол, так они в качестве суррогатного фетиша используют ООП.

[identity profile] jek-hor.livejournal.com 2009-07-12 01:26 pm (UTC)(link)
А как себя должен вести метод класса, если ему подсунули NULL вместо кошерного объекта?

[identity profile] jek-hor.livejournal.com 2009-07-12 01:27 pm (UTC)(link)
А в руби можно сказать так:

irb(main):004:0> nil.to_s.downcase
=> ""


:)

[identity profile] metaclass.livejournal.com 2009-07-12 01:29 pm (UTC)(link)
Как всякая уважающая себя монада - выдавать null на выходе :)

[identity profile] metaclass.livejournal.com 2009-07-12 01:30 pm (UTC)(link)
Языки без строгой типизации это еще один ад.

nil, to_s и downcase какого типа?

[identity profile] vromanov.livejournal.com 2009-07-12 01:32 pm (UTC)(link)
Это просто стиль.. Можно писать двумя способми
string.ToUpper(string.Trim(s))
s.Trim().ToUpper()
второй несколько короче.

[identity profile] jek-hor.livejournal.com 2009-07-12 01:38 pm (UTC)(link)
irb(main):001:0> nil.class
=> NilClass
irb(main):002:0> nil.to_s.class
=> String
irb(main):003:0> nil.to_s.downcase.class
=> String

[identity profile] dizel-by.livejournal.com 2009-07-12 02:13 pm (UTC)(link)
Ты бы ещё перл вспомнил :)

[identity profile] henu3detb.livejournal.com 2009-07-12 02:31 pm (UTC)(link)
Есть мнение, что в хороших программах методы не принимают и не возвращают null. На null реагируют эксепшном. Practical API Design...

[identity profile] mibori.livejournal.com 2009-07-12 02:33 pm (UTC)(link)
оффтопик.

интересно, выражение "садит на коня"/"подсел на коня" употребляют только мои Минские знакомые :)
Знакомые к примеру из Курска, Москвы, Питера, Новосибирска такое выражение не употребляют.
Когда я первый раз столкнулся, не понял о чем речь и пришлось спрашивать :)

[identity profile] thesz.livejournal.com 2009-07-12 02:41 pm (UTC)(link)
Maybe monad, надо уточнить. ;)

[identity profile] 184467440737095.livejournal.com 2009-07-12 02:48 pm (UTC)(link)
а если хочется объединить 'a', 'b', 'c'] в строку 'a,b,c', то нужно писать ','.join(a), что выглядит вполне логично.

[identity profile] metaclass.livejournal.com 2009-07-12 02:52 pm (UTC)(link)
Угу, она, родимая.

[identity profile] metaclass.livejournal.com 2009-07-12 02:54 pm (UTC)(link)
Странно, вроде ничего локально-местного в выражении нету :)

[identity profile] metaclass.livejournal.com 2009-07-12 02:56 pm (UTC)(link)
В хороших языках и хороших программах программист определяет - бывает у типа нулл или не бывает, соответственно функции его или принимают и обрабатывают, или при всем желании его туда не передашь :)

[identity profile] henu3detb.livejournal.com 2009-07-12 03:00 pm (UTC)(link)
Что за языки?

[identity profile] metaclass.livejournal.com 2009-07-12 03:03 pm (UTC)(link)
Haskell, что ж еще :)
Там вещи вроде nullable типов описываются алгебраическими типами данных и обрабатываются явно.

[identity profile] metaclass.livejournal.com 2009-07-12 03:04 pm (UTC)(link)
Выглядит странновато, ссылка на объект считается как бы первым парамером метода, а разделитель в подобном методе я бы лично ставил вторым. И соответственно метод join должен быть методом списка а не строки.

[identity profile] 184467440737095.livejournal.com 2009-07-12 03:08 pm (UTC)(link)
заодно сделать аргумент опциональным, а значением по умолчанию поставить пустую строку.

[identity profile] kkirsanov.livejournal.com 2009-07-12 03:28 pm (UTC)(link)
---И соответственно метод join должен быть методом списка а не строки.
Не пойдет.

Как осуществлять конкатенацию строк известно, а вот разнотипных элементов списка - нет.

Page 1 of 3