UProLa

Неокріпші думки

Індекс

з коментарем

Written by danbst

Вересень 18, 2009 at 21:47

Опубліковано в Службові

Дещо про один міф ООП

Кількість коментарів - 15

Я уже давно задумувався, що з цим ООП щось негаразд.

Буквально на днях я нарешті розшифрував для себе цю абревіатуру – об’єктно-орієнтоване програмування. Це було щось типу “a-ha effect”, еврика, відкриття століття. Тепер я зміг сформулювати своє перше критичне зауваження до парадигми: чому ми класс-орієнтоване програмування називаємо об’єктно-орієнтованим?

Якщо копнути глибше, то під ООП кожен розуміє щось своє або цілий комплекс властивостей:
- власне створення об’єктів і пересилка повідомлень між ними
- наслідування і поліморфізм об’єктів
- писанина типів об’єктів (класів). Клас – це тип
- писанина проміжних абстракцій-класів у мовах, які тільки їх і підтримують (С№, Java)
- організація коду (інкапусляція) у певні одиниці (класи)
- створення ієрархічних структур даних
- зручності типу властивостей, енумів і тп
- інтерфейси

Зараз добре проглядається тенденція розглядати посилання повідомлення як виклик методу. (Якщо хтось не в’їхав у цю фразу: між об’єктами є тільки один тип взаємодії – посилання конкретного повідомлення від одного об’єкта до іншого, і у виразі “abcde”.replace(“a”,”z”) назва функції з аргументами буде повідомленням, “abcde” – об’єктом отримувачем, а посилаючим об’єктом буде наша програма або той об’єкт, в якому ця програма знаходиться). Проте тоді постає питання: у чому принципова різниця між ОКОП (об’єкт-клас ОП) і структурним (модульним) програмуванням?

Правильна відповідь: у наслідуванні та поліморфізмі. Тепер таке питання: навіщо вони потрібні?
- якщо маємо кілька схожих абстракцій, то можна зменшити кількість дублюючого коду (наслідування)
- можна вживати дочірній тип замість батьківського (поліморфізм). Тобто, програмі все-рівно, з яким об’єктом працювати – якщо інтерфейси однакові, то пофігу на реалізацію логіки
- можна створювати свою логіку на основі існуючих компонент у пару кроків (наслідування)

Власне, за це і хвалять ООПшники свою парадигму. Я ж бо відповім на кожен з цих пунктів так:
1. Цей ефект досягається при правильній організації функцій, читай про рефакторинг методів
2. буде нижче
3. Модульне програмування також це забезпечує.

Щодо п 2. Він єдиний стримував мене від написання даного посту. Я думав, що альтернатив йому не існує. А вчора виявив, що по даному пункту уже давно піднято проблему Subtyping-Subclassing. Ось як я її формулюю:

Наслідування класів не еквівалентно створенню підтипів. Або, іншими словами, об’єкт наслідуваного класу (цебто підтипу) не завжди поводить себе у програмах, які очікують на вході об’єкт батьківсього класу (цебто типу), коректно.

Це здається маленькою проблемою (або не здається проблемою взагалі!), проте коли хтось думає про субклас як про субтип, то він здійснює логічну помилку. Архітектура проекту, яка виконується при такій зіпсованій логіці, обо’язково перетвориться у монструозну мішанину змістів і нам знадобляться паттерни, обмеження на гнучкість, обмеження на розширення і тд і тп. Причому шанс цього збільшується при розростанні проекту.

Про проблему я прочитав у Олега. Думаю, вам також корисно буде це зробити, якщо досі вважаєте підклас підтипом. З моєї точки зору, вся ця махінація з класами є не більш ніж синтаксичним екстрактом з цукрових буряків, точно така сама як динамічна типізація або створення змінних у будь-якому місці, а не тільки у заголовку. А ще хорошим прикладом того, як здавалось би логічні речі (представлення навколишнього світу у вигляді ієрархії об’єктів) є насправді не завжди логічним з точки зору математики.

Peace!

Written by danbst

Січень 18, 2012 at 18:23

Опубліковано в Програмування

Ель Ксах. Трейлер^W Пролог

Кількість коментарів - 2

- Діду, а чому імператор заборонив магію?

Тихо потріскував вогонь, і легенькі яскраві мушки вилітали з нього вверх, назустріч холоду і смерті. В хатинці все-рівно було прохолодно, тому Горобець лежав укутаний у хутряний коцик і накритий шкіряним плащем. Дідовим шікряним плащем… За малечою потрібно доглядати, берегти, адже інакше не вийде з неї в майбутньому нічого путнього. Хто сказав, що проблеми і незгоди в дитинстві зроблять воїна в майбутньому? Ніколи. Тільки виховання, розуміння цінностей і ціни життю може цьому допомогти. Дід про це чудово пам’ятав, адже саме такими словами виховували його. Маленьким треба допомагати, адже у них ще стільки незгаяного часу, котрим можна *правильно* розпоряджатись. І цьому можна навчити, варто тільки доглядати за ним. Але ні в якому разі не піддакувати примхам, він малий, а отже не розуміє, що бажання – це ніщо перед часом, і коли …

- Хіба магія може зробити комусь щось погане? Якби у нас була магія, ми могли б зробити багато хліба і роздати його сусідам. І не були би голодні! Я хочу бути магом! Я прийду до імператора і покажу, що магія – це добре. Він не зможе мене не послухати!

Дід голосно кашлянув: “Аа-акх, кха-аа” і мимоволі здригнувся. Йому стало прохолодно. Остання дерев’яшка уже давно тліла в печі, тому підживити вогонь було нічим. А на вулицю вночі не вийдеш, у тебе ж немає нічного зору, яке так сильно допомагає ельфам. Та й взагалі – виходити з дому немає змісту, бо сокири немає. Позичив Ібрагіму, сиди тепер, мерзни. Не те щоб Ібрагім був поганим парубком, ні, він хороший, виконує що каже, але чому він приходить саме тоді, коли скрута от-от почнеться, але ти цього ще не знаєш? Хоча відсутність дров передбачити було неважко… Ех, старість дає про себе знати…

- А ще я збудую монастир, де буду розповідати всім про магію, і стану відомим на весь Світ! Я куплю багато книжок і напишу в них всі заклинання, які я знаю. І буду продавати книжки людям, і стану багатим! Діду, я стану багатим!

Малий просто сяяв від своїх фантазій. Дригався весь, ніби вмоститись не може і сміявся. Ось воно – щастя, подумав дід. Воно знаходиться всередині тебе, а не в оточуючих речах. Речі слугують всього-лиш триггерами, і нетямущі приймають ці триггери за прояви інстансів щастя. Та й біс з ними, якщо вони тобі не заважають. А то бували й такі, яких убити було мало… Щоправда давно це було, коли я ще був молодий…

- Я придумав! Я наберу так багато грошей, що сам стану Імператором і всім дозволю магію! Ох, як це круто!..

- Якщо чесно, малий, я тобі трошки збрехав. Імператор заборонив не всю магію.

- Не всю?! – його очі та губи так і залишилися у вигляді знаку питання.

- Не всю. – Думаю, малому уже можна розповідати такі казки. Жаль, що вони не зовсім казки. – Імператор заборонив тільки білу магію. Чорну магію можна вчити і застосовувати. Власне, цим і займаються на нашому континенті.

- А в чому різниця між чорною і білою магією?

- Ну… Основна різниця у використанні часу. Чорна магія потребує мало часу, а біла – багато.

- Тоді виходить, що чорна магія – це добре! А коли я зможу почати її вчити?

Цю репліку дід очікував. Це означає, що зі здоровим глуздом у малого все в порядку. Залишилось дочекатись, коли проявиться цікавість – поршень усього сущого.

- Коли тобі стане 12 років, до нас прийдуть енцефали імператора. Вони шукають дітей, здібних до магії. Розпізнати енцефала дуже важко, адже вони використовують свої хитрі штуки для маскування і допитування. Якщо ти зможеш виконати їхні задачі, вони запропонують тобі відвідати замок імператора. Відмовитись від пропозиції ти не зможеш, – сумно додав дід.

Малий задумався і замовк. Кілька хвилин дід чекав наступного запитання, але очі у малого були закриті. “Невже заснув?”, подумав дід і тільки зібрався піднятись та підійти до лавки, як Горобець озвався, з новим настроєм у голосі:

- А задачки там будуть важкі?

Останні пломені вогню погасли і тільки розжарені вуглики освітлювали кімнату… якщо це можна було назвати освітленням. Силуети предметів здавались тінями… а може, це і були тіні? Хуртовина на дворі тільки посилювалась, це добре відчувалось через сильні тріскоти на стрісі. Грошей на черепицю їм не незбирати на заробітки діда, а малий ще не скоро зможе сам приносити вагомий дохід. Важко виховувати дітей самому…

- Енцефали отримають від тебе рішення задачі так, що ти цю задачку навіть не помітиш. Вони справді дуже хитрі… і розумні. Вони шукають дітей зі спеціальним типом мислення, а у тебе він виражений, добре виражений.

- Тобто, я вирішу їхні задачки і мене заберуть в замок вчити магію? – усміхнувся малий.

На цей раз замовк дід. Хоч ця людиська ще маленька, але уже може різанути душу. Це неприємно признавати, але увесь стан речей веде тільки до одного. Не вийде діду розповісти малому *суть* усього світу, яку так довго розкопував він та його соратники багато-багато років тому. Не взнає малий про великих Наставників і героїчні битви на гранях Світу. Не зможе оцінити усі сторони безмежної Магії і виконати правильний глобально, а не локально, вибір. З іншої сторони, стандартизація – це добре. Імператору вдалось знайти закони, які схожі на закони і виконуються як закони.

- Так… Тобі розкажуть все… про Чорну Магію.

Усмішка знову з’явилась на обличчі Горобця. Він закрив очі і заснув, вірніше, діду так здалося. З тихим скрипом дід спустився вниз і підійшов до лавочки. Хоч вона і на півметра коротша від діда, але згоорнутись калачиком завжди можна. З двері чулося тихе “тук…. тук….”, дах горів шумом вітру, світло вогню втекло майже все, а озноб торкнувся плеча. Якби не голод, з цим ще можна було жити. Але зараз було дуже важко. Ще ці питання малого…

Дід засинав. В останній момент перед сном він згадав про Еліту. “Якщо це не легенди, то Еліта скоро відродиться. І тоді душу малого можна буде врятувати. Ех, коли ж це станеться?”

Остання червона вуглинка спалахнула у свій останній раз і назавжди віддала світло туди, де у ньому найбільша потреба – у Ніщо.

Written by danbst

Грудень 30, 2011 at 15:44

Опубліковано в Програмування

Follow

Get every new post delivered to your Inbox.