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] vp.livejournal.com 2009-07-12 12:57 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] mibori.livejournal.com 2009-07-12 02:33 pm (UTC)(link)
оффтопик.

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

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

[identity profile] sergiej.livejournal.com 2009-07-12 09:46 pm (UTC)(link)
В жабе просто ".wav".equals... и все дела. И нулл нужен, пустая строка не есть отсутствие строки.
wizzard: (Default)

[personal profile] wizzard 2009-07-12 10:07 pm (UTC)(link)
Extension methods to the rescue. Смотрится вполне пристойно в итоге.

Там можно и на null this проверять, вроде.

Кроме того, никто ж не мешает написать свои строки, если совсем туго станет :)

[identity profile] nivanych.livejournal.com 2009-07-13 06:28 am (UTC)(link)
Что ж так всё страшно!
Я-то уж собирался раз и навсегда
вернуться обратно в объектно-ориентированному,
даже уже думал, как бы терминальные F,G-диалгебры
приспособить для моделирования интерфейсов.
А тут! Это попытка расжигания меж...межжж какой...
В общем, розни!
;-) ;-)

[identity profile] ennor.livejournal.com 2009-07-13 07:34 pm (UTC)(link)
Это работа потомков тех самых коммунистов, которые в свое время придумали SmallTalk.

ЗЫ Вообще, посидев несколько лет на мультипарадигмальных языках типа SQL, я сейчас с трудом понимаю, зачем нужны все остальные :)

[identity profile] adontz.livejournal.com 2009-07-19 02:16 pm (UTC)(link)
Метод есть, но не в System.String, а в CultureInfo.TextInfo

[identity profile] alexey-rom.livejournal.com 2009-07-19 03:47 pm (UTC)(link)
Бесит то, что объекты любого типа вообще могут быть null и соответственно "использование этого null как маркера". То есть недостаточное количество ООП-фетишизма :)