LINUX.ORG.RU

Что не так с сообщениями в ООП

 ,


1

1

Мысль довольно простая, но она почему то дошла до меня только сейчас, когда я читал кое какие вещи по лингвистике.

В ООП объекты получают сообщения, это так же как и в RL. А разница в чем? В том что каждый объект имеет свой язык(!!!).

Свойства, методы, их имена, названия, это сообщения. Для этих имен должен быть общий словарь, так же как и у людей есть общий язык.

Некоторым аналогом этого является глобальное пространство имен, но некоторые проблемы реализации не позволяют это использовать полноценно. Поэтому де-факто концепция языка и обмена сообщениями не раелизуется в ООП и никто даже не думает обычно в этом смысле когда программирует

А что касается проблем, одна из них в том, что не реализовано обобщение(возможно отчасти это проблема раннего нединамического связывания). Например

Командир говорит: «возьмите в руки свое оружие»

Солдат Вася должен взять палицу, а солдат Петя копье, они оба должны понять выражение «взять свое оружие» и применить к собственной специфике.(это можно реализовать в рамках паттерна издатель-подписчик)



Последнее исправление: no2700 (всего исправлений: 3)

Свойства, методы, их имена, названия, это сообщения.

нет. свойства это данные. методы это поведение. сообщения это вызов метода, то есть призыв к некоему действию в рамках определённого поведения.

Для этих имен должен быть общий словарь

это называется интерфейс, который декларирует модель поведения в ваших терминах словарь сообщений.

vtVitus ★★★★★
()
Ответ на: комментарий от vvn_black

На инглише.

Значит, мы с тобой нечеловеки. Или мы не общаемся.

Директор…

Это должность, а не человек, значит, оффтоп

anonymous
()
Ответ на: комментарий от Egor_

Ничего одномерного в письменности нет.
Если бы было так просто, человек бы в жизни не придумал ни одного анекдота, панчлайна или, например, закона УК РФ.
То, что мне нужно последовательно набрать буквы в более менее определённом порядке на двумерном объекте, вроде экрана - это проблема синхронности восприятия и анатомии макакских. При личном общении мозг может синхронно ещё и тон/позу/мимику/запах считывать. Но не речь.

system-root ★★★★★
()
Ответ на: комментарий от wandrien

Поздравляю, вы изобрели полиморфизм

Скорее интерфейсы.

no-such-file ★★★★★
()

Да, интерфейс или протокол является близким аналогом языка.

Но объекты не интерпретируют этот язык. Там как правило просто набор жестко заданных реакций. Вот в чем главная разница.

Объект должен быть интерпретатором языка.

no2700
() автор топика
Ответ на: комментарий от no2700

Если подходить к реализации объекта как к интерпретатору, то объекты должны помимо жестко заданных реакций на сообщения парсить их, строить AST, интерпретировать, делать все то же что делает интерпретатор или делегировать это интерпретатору или другому объекту.

no2700
() автор топика
Ответ на: комментарий от no2700

Объект получающий сообщения и так суть интерпретатор, просто сообщения и реакции примитивны до крайности.

no2700
() автор топика

В Обероне можно так:

MODULE A;
	CONST
		defaultShape = 1;
		textShape = 2;
	
	TYPE
		MouseMsg = RECORD
			x, y: INTEGER;
			btns: SET;
			shape: INTEGER;
		END;
		
		CharMsg = RECORD
			ch: CHAR;
		END;
		
		Object = POINTER TO RECORD
		END;
	
	PROCEDURE (o: Object) HandleMessage (VAR msg: Message), NEW;
	BEGIN
		WITH
		| msg: MouseMsg DO
			msg.shape := textShape;
			HandleMouse(o, msg);
		| msg: CharMsg DO
			InsertChar(o, msg.ch);
		ELSE END;
	END HandleMessage;
	
END A.
X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 2)

Патамушто язык он не для объектов, а для программиста.

возьмите в руки свое оружие

otryad.foreach(you => you.take(you.selected_weapon))

otryad.foreach(you => you.take(‘selected-weapon’))

otryad.foreach(you => you.take(Soldat.SELECTED_WEAPON))

Выбирай, чего выдумывать. Паттерн-матчируй сколько влезет, а как надоест бери первый явный способ.

anonymous
()
Ответ на: комментарий от praseodim

Будет хорош любой язык с динамическим диспатчем — хоть питон, хоть жс, хоть луа, хоть ручной диспетчер на сишке или с сахаром, ака объектив си. Смаллталк вообще ни разу не особенный, чтобы на него ради этого смотреть.

anonymous
()
Ответ на: комментарий от wandrien

Да бо́льшая половина ивент фреймворков имеет сендера первым аргументом или в составе ивента. Если делать его неявным, то придется придумывать правила, кто именно является сендером, как это делегировать и вообще caller метаэтовсе. Явно передавать его куда проще для всех, а если не нужен, то вообще не передавать.

В программировании вообще не важно, кто что «сказал», важен лишь контекст исполняемой задачи, а как это все скомпоновано — это лишь деталь реализации, которую потом заколебешься разматывать при рефакторинге, если на нее ненароком обопрешься. Вы всеми этими мессадж пассингами а-ля почтовые письма повышаете связность системы, также как компании, в которых много ключевых сотрудников, которых нельзя уволить без проблем. Должно быть как: прилетело сообщение, сделал дело, отправил результат дальше по трубам, а кто там с любой из сторон — глубоко похрен. А у вас надо ещё и людей переучивать, потому что у васи были свои заморочки с петей, а теперь после перестановок заморочки потерялись, и вообще без пети вася отказывается тест на профпригодность проходить или хитрит, говорит одно, делает другое.

anonymous
()
Ответ на: комментарий от anonymous

Не знаю, у кого «у вас».

Я не выступаю за какую-то из обсуждаемых моделей. Я только указал, что называть вызов метода отправкой сообщения логически некорректно.

wandrien ★★
()
Ответ на: комментарий от wandrien

А где Message объявлен?

Можно написать

TYPE
	Message = ANYREC;

или

	TYPE
		Message = ABSTRACT RECORD END;
		
		MouseMsg = RECORD (Message)
			x, y: INTEGER;
			btns: SET;
			shape: INTEGER;
		END;
		
		CharMsg = RECORD (Message)
			ch: CHAR;
		END;

.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от wandrien

Это от терминологии зависит и от наших договоренностей о ней. Я вот могу тебе в инбокс на лоре написать, а ты мне нет. Но это же не значит, что ты не можешь отправить мне сообщение из под анонимуса. Адрес откуда оно пришло не имеет значения, важно лишь содержание. Такшта вполне корректно, как по мне.

вызов метода

Так это вообще деталь реализации отправки сообщения. Под вызовом метода (а.б()) может скрываться просто вызов __А_б(а), а может полноценный диспатч. Без указания конкретной реализации, что такое вызов метода, этого нельзя заявить.

anonymous
()
Ответ на: комментарий от anonymous

Адрес откуда оно пришло не имеет значения, важно лишь содержание

ЭЭэ как это. Одно дело анонимус написал, что он меня достанет, другое дело - тарищ майор. В одном случае можно проигнорить, в другом ховаться.

ТОму, кто придумал эту капчу с долгим фейдом надо в голову гвоздь задить.

anonymous
()

Как понять, что пост пишет очередная реинкарнация anonimous? Автор придумал проблему, которой нет, и недоволен тем, что ее не хотят решать.

Aswed ★★★★★
()
Ответ на: комментарий от anonymous

Бодяга про ООП, Семён-анон, а гляди ж, только на второй странице задетектили и про круг напомнили.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.