Список форумов forum.alsor.net forum.alsor.net
Форум небольшого круга друзей
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

и так наследование...
На страницу Пред.  1, 2, 3, 4
 
Начать новую тему   Ответить на тему    Список форумов forum.alsor.net -> IT-форум
Предыдущая тема :: Следующая тема  
Автор Сообщение
Snoopy



Зарегистрирован: 29.11.2005
Сообщения: 1395

СообщениеДобавлено: Чт Мар 12, 2009 5:53 pm    Заголовок сообщения: Ответить с цитатой

alsor писал(а):
У Мишки эта абстракция нечто вроде - "Unit это нечто что может ездить, стрелять, плавать, скрываться и ....".


Протестую! Unit у меня сам не может ничего - только его потомки.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Чт Мар 12, 2009 6:14 pm    Заголовок сообщения: Ответить с цитатой

Snoopy писал(а):
Протестую! Unit у меня сам не может ничего - только его потомки.


Хм... ну я еще посмотрю твой код, как только домой приду. Но как-то я даже не знаю что тебе ответить Smile Я не был готов к абстракции "объект который не может делать ничего" Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
dimitr



Зарегистрирован: 28.11.2005
Сообщения: 1124

СообщениеДобавлено: Чт Мар 12, 2009 9:03 pm    Заголовок сообщения: Ответить с цитатой

Snoopy писал(а):
Протестую! Unit у меня сам не может ничего - только его потомки.

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



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Пт Мар 13, 2009 4:21 am    Заголовок сообщения: Ответить с цитатой

Мое творение: http://alsor.net/files/sandbox.zip

А в мою игру можно даже поиграть Smile запустив класс Game. Вот так например:
Код:

> start 100 100
Game started
> put truck 20 20
Created Truck [h:30, p:(20,20)]
> put tank 50 50
Created Tank [h:100, p:(50,50)]
> select 50 50
Selected: Tank [h:100, p:(50,50)]
Tank [h:100, p:(50,50)] > move north
Moving
Tank [h:100, p:(50,49)] > move west
Moving
Tank [h:100, p:(49,49)] > target 20 20
Targeting
Tank [h:100, p:(49,49)]  -> Truck [h:30, p:(20,20)] > fire
Tank [h:100, p:(49,49)]  -> Truck [h:20, p:(20,20)] > fire
Tank [h:100, p:(49,49)]  -> Truck [h:10, p:(20,20)] > fire
Tank [h:100, p:(49,49)]  -> Truck [h:0, p:(20,20)] > fire
Tank [h:100, p:(49,49)]  -> Truck [h:-10, p:(20,20)] > put stealth 70 70
Created Stealth [h:100, p:(70,70)]
Tank [h:100, p:(49,49)]  -> Truck [h:-10, p:(20,20)] > select 70 70
Selected: Stealth [h:100, p:(70,70)]
Stealth [h:100, p:(70,70)] > goInvisible
Stealth [h:100, p:(70,70)] > select 49 49
Selected: Tank [h:100, p:(49,49)]
Tank [h:100, p:(49,49)]  -> Truck [h:-10, p:(20,20)] > target 70 70
No unit in (70,70)
Tank [h:100, p:(49,49)] > exit


А вот как поиграть в Мишкину...

Передвижение видно только в GameTest - там Грузовик не проедет по реке, а Танк проедет.
Со Стэлсом мне тока не очень понравилось как реализовано - как-то кривовато торчит protected метод... нужно еще подумать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Snoopy



Зарегистрирован: 29.11.2005
Сообщения: 1395

СообщениеДобавлено: Пт Мар 13, 2009 11:17 am    Заголовок сообщения: Ответить с цитатой

Гы, Леш, а это ничего вообще, что у тебя большинство операций выполнляются тоже над базовым классом, т.е. над Unit? Как говорится "за что боролись - на то и напоролись". Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Пт Мар 13, 2009 12:05 pm    Заголовок сообщения: Ответить с цитатой

Snoopy писал(а):
Гы, Леш, а это ничего вообще, что у тебя большинство операций выполнляются тоже над базовым классом, т.е. над Unit? Как говорится "за что боролись - на то и напоролись"


Гм.. ну да. Я же уже писал что для кода гораздо удобнее когда весь интерфейс сосредоточен в классе Unit, потому что остальному кода как-то даже и не за чем узнавать что там за юнит. Но при этом юниты полиморфны в полном смысле этого слова - и это подтверждает тест - танк проехал, грузовик нет, танк выстрелил, стелс спрятался... и так далее. Видишь здесь какие-то нехорошести? Расскажи.

Кстати, поверь, я совершенно не думал о том что где-то нужно задействовать наследование, или не старался где-то его не задействовать. Единственное что направляло мои решения - тесты. Я писал тест именно так как его мне проще и понятнее написать, а только после этого я писал код который выполнит тест. Если где-то понадобилось что-то от чего-то унаследовать - я это делал.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Snoopy



Зарегистрирован: 29.11.2005
Сообщения: 1395

СообщениеДобавлено: Пт Мар 13, 2009 12:27 pm    Заголовок сообщения: Ответить с цитатой

Цитата:

Гм.. ну да.


VS

Цитата:

- что касается наследования - если уж ты наследуешь что-то, то единственное обоснование тому - полная подстановка - т.е. использование производного типа ровно так же как базового - потому что наследование имеет смысл только на уровне типа
...
- Ну тебя послушать - так при наследовании интерфейс вообще расширяться не может получается.
- ИМЕННО!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Пт Мар 13, 2009 12:35 pm    Заголовок сообщения: Ответить с цитатой

Snoopy писал(а):
большинство операций выполнляются тоже над базовым классом


alsor писал(а):
использование производного типа ровно так же как базового


ты видишь между двумя этими фразами VS? Мы наверно Мишк перестали друг друга понимать... В чем ты видишь тут разногласие? Поясни.

Эта цитата помоему еще из нашей беседы в аське - и я тебе еще там сказал, что расширять интерфейс базового класса врят ли имеет смысл, потому что скорее всего код будет использовать потомков как их базовый тип - иначе код будет слишком хрупкий и не аддитивный. И я тебе говорю - в своем коде я даже не пытался этого даказывать - я писал его так как мне удобно, и вышло что никакие потомки у меня не расширяют интерфейсов базовых классов - у них ровно тот же набор публичных методов что и в базовом - оно так само получилось ей богу Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Snoopy



Зарегистрирован: 29.11.2005
Сообщения: 1395

СообщениеДобавлено: Пт Мар 13, 2009 1:00 pm    Заголовок сообщения: Ответить с цитатой

Ну например расскажи, зачем юниту captureTargetIn(x,y), если он не умеет стрелять? Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
teg



Зарегистрирован: 20.12.2005
Сообщения: 410

СообщениеДобавлено: Пт Мар 13, 2009 1:12 pm    Заголовок сообщения: Ответить с цитатой

Алексей свёл всё к метаданным. А зачем тогда Truck и Tank?

Код:
class UnitFactory {
Unit createTank() {...};
Unit createTruck() {...};
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Пт Мар 13, 2009 1:21 pm    Заголовок сообщения: Ответить с цитатой

Snoopy писал(а):
Ну например расскажи, зачем юниту captureTargetIn(x,y), если он не умеет стрелять?


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

Но это я так предположил... Давай предположим что действительно будут юниты которым нацеливаться незачем... ну пусть это будет та же ПолеваяКухня которая должна просто присутствовать рядом с юнитами иначе они помрут с голода, но при этом она может передвигаться.

Хотя ты знаешь... на самом деле я наверно переделаю этот метод (ровно как и методы движения) в команды, но при этом слегка расширил бы возможности команд. о! точно. я бы свел интерфейс юнита к такому:

Код:

class Unit {
  public void doCommand(String command); // команда без параметров
  public void doCommand(String command, int x, int y); // воздействие на ячейку, например идти туда-то
  public void doCommand(String command, Unit unit); // воздействие на другой Юнит, а может даже и на себя
}


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

Т.е. суть в том, что этот интерфейс продиктован возможностями самой игры, то есть теми возможностями которые игра предоставляет пользователю, потому что пользователь будет управлять Юнитами. Но в твоем случае - когда ты строишь иерарию юнитов и распределяешь по ней методы - интерфейс продиктован внутренними особенностями юнитов - мне это не нравится.

Контраргументы?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Пт Мар 13, 2009 1:24 pm    Заголовок сообщения: Ответить с цитатой

teg писал(а):
Алексей свёл всё к метаданным. А зачем тогда Truck и Tank?

Код:
class UnitFactory {
Unit createTank() {...};
Unit createTruck() {...};
}


Согласен - я уже был к этому близок Smile

Кстати, Серега, ты наверняка уже наваял свою версию - делись Smile Ну или хотя бы идеями.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Snoopy



Зарегистрирован: 29.11.2005
Сообщения: 1395

СообщениеДобавлено: Пт Мар 13, 2009 1:24 pm    Заголовок сообщения: Ответить с цитатой

Серега, покажи уже пример чтоль! А то, блин, как тот китайский гуру - истину вроде знаешь, но говоришь что-то непонятное. Razz
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
teg



Зарегистрирован: 20.12.2005
Сообщения: 410

СообщениеДобавлено: Пт Мар 13, 2009 7:53 pm    Заголовок сообщения: Ответить с цитатой

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

Роль Юнита полностью раскрывается по отношению к Полю. ))

Поле отвечает за перемещение объектов (изменение координат). При этом Юнит -- ничего сам не делает. Подсунем другое поле, и юниты будут по-прежнему по нему бегать. Требуется ввести класс Координаты и убрать зависимости от них из Юнита. На мой взгляд методы "передвинуть*" там не нужны. Их появление -- это следы существующего интерфейса. Соответственно, вся роль Юнита -- хранение текущих координат при полном неведнии что это такое.

В том же духе я бы и продолжал. Если взять процесс стреляния, то тут много такого чего и не снилось. Надо учесть хэлс, скорость, дистанцию, разность высот, степень износа стреляющего, аджалити цели, площадь поражения (или хотя что-то из этого). Всё это достойно отдельного управляющего объекта (подобного классу Поле).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Пт Мар 13, 2009 8:03 pm    Заголовок сообщения: Ответить с цитатой

teg писал(а):
Требуется ввести класс Координаты и убрать зависимости от них из Юнита


Не поверишь, но я это даже начал реализовывать... У меня в коде есть набор полей в Unit которые с доступом только внутри пакета, но я хотел уже сделать следующее - выделить объект Position который обязательно будет в одном пакете с моим GameField, а в Unit на него будет лишь ссылка - он будет передавать её в GameField для того чтобы он ей манипулировал, а GameField будет знать о структуре Position больше чем другие - из-за доступа в пределах пакета, соответственно никто извне не сможет двигать юниты. А юниты при этом могут быть в другом пакете - потому что при разрастании это скорее всего потребуется.

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

Но суть то в том - что мы сейчас говорим совершенно о других объектах, а не о тех о которых так сильно заботится Мишка, и я сразу сказал, что на первый взгляд кажется что игра это про юниты - а на самом деле это совершенно не так.
_________________
JIT happens!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов forum.alsor.net -> IT-форум Часовой пояс: GMT + 4
На страницу Пред.  1, 2, 3, 4
Страница 4 из 4

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB