metaclass: (Default)
[personal profile] metaclass
В .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"){
}


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

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

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

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

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

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2009-07-12 03:04 pm (UTC) - Expand

(no subject)

From: [identity profile] 184467440737095.livejournal.com - Date: 2009-07-12 03:08 pm (UTC) - Expand

(no subject)

From: [identity profile] kkirsanov.livejournal.com - Date: 2009-07-12 03:28 pm (UTC) - Expand

(no subject)

From: [identity profile] kkirsanov.livejournal.com - Date: 2009-07-12 03:31 pm (UTC) - Expand

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

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

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

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

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

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

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

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

(no subject)

From: [identity profile] henu3detb.livejournal.com - Date: 2009-07-12 02:31 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2009-07-12 02:56 pm (UTC) - Expand

(no subject)

From: [identity profile] henu3detb.livejournal.com - Date: 2009-07-12 03:00 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2009-07-12 03:03 pm (UTC) - Expand

(no subject)

From: [identity profile] potan.livejournal.com - Date: 2009-07-12 07:41 pm (UTC) - Expand

(no subject)

From: [identity profile] alexey-rom.livejournal.com - Date: 2009-07-19 04:10 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2009-07-12 02:41 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2009-07-12 02:52 pm (UTC) - Expand

Date: 2009-07-19 04:01 pm (UTC)
From: [identity profile] alexey-rom.livejournal.com
А ему не должно быть возможности "подсунуть NULL вместо кошерного объекта". Или nil -- кошерный объект (как в Ruby), или нельзя его допускать куда ни попадя.

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

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


:)

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

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

(no subject)

From: [identity profile] jek-hor.livejournal.com - Date: 2009-07-12 01:38 pm (UTC) - Expand

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

(no subject)

From: [identity profile] lupus-lupusum.livejournal.com - Date: 2009-07-12 06:32 pm (UTC) - Expand

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

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

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

(no subject)

From: [identity profile] migmit.vox.com - Date: 2009-07-12 04:38 pm (UTC) - Expand

(no subject)

From: [identity profile] slonopotamus.livejournal.com - Date: 2009-07-12 07:04 pm (UTC) - Expand

(no subject)

From: [identity profile] mibori.livejournal.com - Date: 2009-07-12 07:30 pm (UTC) - Expand

Date: 2009-07-12 06:17 pm (UTC)
From: [identity profile] kurilka.livejournal.com
можно переспросить?

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2009-07-12 06:23 pm (UTC) - Expand

(no subject)

From: [identity profile] kurilka.livejournal.com - Date: 2009-07-12 06:28 pm (UTC) - Expand

(no subject)

From: [identity profile] mibori.livejournal.com - Date: 2009-07-12 07:38 pm (UTC) - Expand

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

Date: 2009-07-12 07:42 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Это надо в мозги архитекторам дотнета вколотить - у них там где нул, где пустые строки, что попало, в общем.

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

Date: 2009-07-19 03:55 pm (UTC)
From: [identity profile] alexey-rom.livejournal.com
Но и отсутствие строки не есть строка. Так что переменной типа string не должно быть возможно присвоить значение "отсутствие строки" или вернуть его из метода. Но этот поезд давно ушёл :(

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

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

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

Date: 2009-07-19 03:49 pm (UTC)
From: [identity profile] alexey-rom.livejournal.com
Но они всё равно будут nullable :( struct-ами ведь их не сделать.

(no subject)

From: [personal profile] wizzard - Date: 2009-07-19 05:11 pm (UTC) - Expand

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

Date: 2009-07-13 07:01 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ну, может если построить свое ООП с блекджеком и шлюхами элементами ФП, то и лучше получится :)

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2009-07-13 07:17 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2009-07-13 09:22 am (UTC) - Expand

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

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

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

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 8th, 2025 04:18 am
Powered by Dreamwidth Studios