пятница, января 06, 2006

Мартин Фаулер: имплементация неявного интерфейса

В свежем посте своего блога, почему-то названного Блики, Мартин поднимает довольно интересную проблему: почему в современных объектно-ориентированных языках программирования (Мартин рассматривает Java и C#, но к ActionScript 2/3 это в равной степени применимо) класс может имплементировать только явные интерфейсы (то есть те, что объявлены с ключевым словом interface):


0: interface A
1: {
2: public function someMethod ():Boolean;
3: }

0: class B implements A
1: {
2: public function B ()
3: {
4:
5: }
6:
7: public function someMethod() : Boolean
8: {
9: return true;
10: }
11: }

Причем, понятно, может имплементировать сколько угодно этих «чистых» интерфейсов. С классами же возможно только наследование. Класс наследуется только от одного класса. Но ведь набор публичных методов класса определяет его «неявный» интерфейс!

Так почему бы не ввести в языки программирования со статической типизацией возможность имплементировать интерфейс готового класса!? Например:


0: /**
1: * Это просто класс, содержащий "неявный" интерфейс (как и любой класс).
2: */
3: class A
4: {
5: public function A ()
6: {
7:
8: }
9:
10: public function someMethod ():Boolean
11: {
12: return true;
13: }
14:
15: private function somePrivateMethod ():Number
16: {
17: return 0;
18: }
19: }

0: /**
1: * Данный класс просто служит целям иллюстрации суперкласса.
2: */
3: class C
4: {
5: public function C ()
6: {
7:
8: }
9:
10: public function anotherMethod ():String
11: {
12: return "";
13: }
14: }

0: class B extends C implements A
1: {
2: public function B ()
3: {
4:
5: }
6:
7: /**
8: * Данный метод просто служит целям имплементации "неявного" интерфейса класса A.
9: */
10: public function someMethod ():Boolean
11: {
12: // Понятно, что super здесь не применим. Это имплементация, а не наследование.
13: return false;
14: }
15:
16: public function anotherMethod ():String
17: {
18: return someMethod () ? super.anotherMethod () : "Nothing";
19: }
20: }

Это же было бы просто чертовски архиудобно! Во-первых, во многих случаях не пришлось бы выделять интерфейс. Просто элементарно меньше работы.

Во-вторых, есть классы, которые не имплементируют интерфейсов (собственно, все классы, написанные Macromedia для <=8-го плеера). Но иногда очень надо сделать заглушку (скажем, для тестирования ) какого-нибудь заковыристого класса от Macromedia, который никакого интерфейса не имплементирует. И пишешь просто implements DataGrid. И все :)

И, присоединяясь к Мартину, я задаюсь вопросом: а почему этого нет? Почему?

Нет ответа...

Комментариев 7:

Anonymous Fix сообщает:

Странно, что у меня тоже возникал такой же вопрос, когда я начал знакомиться с AS2.0 .. Но я тогда не стал его задавать вслух, дабы не показать свою некомпетентность (я OOP то учу только на практике на flash, а истоков к своему стыду не читал). Но раз сам Фаулер (не знаю, кто такой, но мне в рассылке посоветовали его почитать :)) задал тот же вопрос.. :)

06 января, 2006 11:11  
Blogger Constantiner сообщает:

2fix
Мартин Фаулер - апологет и гуру ООП, который довольно много работы проделал на ниве популяризации этого дела. В частности именно он является автором основополагающей книги по рефакторингу. Также Мартин является активным стороннником гибкого (agile) процесса разработки и вместе с другим гуру, Кентом Беком, активно двигает в массы идеологию eXtreme Programming (XP). По сути для меня Бек и Фаулер на данный момент являются теми олимпийскими богами, на которых стоит равняться :)

06 января, 2006 11:36  
Anonymous Анонимный сообщает:

Технически в C# этого уже не сделать по очень простой причине - наличия раннего связывания. Собственно, в Java оно тоже есть в неявном виде (модификатор final).

Здесь уместно вспомнить mock-технологию, которая работает только для виртуальных методов.

Думаю, каждый понимает, что и C#, и Java - это не языки, а технологии, поэтому, чтобы лицезреть реализацию подобного удобства придётся подождать очередной попытки переворота (как минимум).

Кроме того, придётся сменить парадигму программирования с объекто-ориентированной на "контрактную".

А можно проще: пересесть на SmallTalk.

19 января, 2006 11:50  
Blogger Constantiner сообщает:

2Anonymous
Я вот тоже периодически смотрю на Smalltalk. Было бы время - пощупал бы. Только вот, если честно, не очень понятна мне его коммерческая адекватность. Востребован он и разработчики на нем?

19 января, 2006 19:57  
Anonymous Анонимный сообщает:

2Constantiner
Не помню, где прочитал (кажется, у Влиссидеса): программистов на SmallTalk 50 тысяч. Если вспомнить, что в мире программистов миллионы, то становиться очевидно, что промышленное ПО на SmallTalk не пишут. А если и пишут, то очень мало (и не в России).

Даже такой большой любитель SmallTalk как Кент Бек, активно работает на Java... Хотя легендарный C3 разрабатывался на SmallTalk.

Фаулер сказал примерно так: "Я люблю прототипировать на SmallTalk, но для основной разработки предпочитаю язык со строгой типизацией."

20 января, 2006 07:38  
Anonymous Анонимный сообщает:

Блики? Это ж очевидно. Blog + Wiki

23 июля, 2006 00:25  
Blogger Constantiner сообщает:

Да, оно самое :)

23 июля, 2006 00:42  

Отправить комментарий

Ссылки на пост:

Создать ссылку

Вернуться на главную