Я буду настолько прямолинеен, насколько смогу, в отношении этой проблемы, потому что должно быть что-то, что я полностью упускаю из-за опыта структурированного программирования.
Скажем, у меня есть класс Player. Этот класс Player выполняет такие действия, как изменение своего положения в игровом мире. Я вызываю этот метод warp(), который принимает экземпляр класса Position в качестве параметра для изменения внутренней позиции Player. С точки зрения объектно-ориентированного программирования это имеет для меня полный смысл, потому что я прошу игрока что-то «сделать».
Проблема возникает, когда мне нужно делать другие вещи в дополнение к простому изменению положения игроков. Например, скажем, мне нужно отправить это событие деформации другим игрокам в онлайн-игре. Должен ли этот код также находиться в методе warp() Player? Если нет, то я бы представил объявление какого-то вторичного метода, скажем, в классе сервера, например warpPlayer(player, position). Кажется, что это сводит все, что делает игрок, к серии геттеров и сеттеров, или я просто ошибаюсь? Это что-то совершенно нормальное? Я бесчисленное количество раз читал, что класс, который представляет все как серию геттеров/сеттеров, указывает на довольно плохую абстракцию (используется как структура данных вместо класса).
Та же проблема возникает, когда вам нужно сохранить данные, сохранив их в файл. Поскольку «сохранение» проигрывателя в файл находится на другом уровне абстракции, чем класс Player, имеет ли смысл иметь метод save() в классе проигрывателя? Если нет, то внешнее объявление типа savePlayer(player) означает, что методу savePlayer потребуется способ получить все необходимые данные из класса Player, что в конечном итоге приведет к раскрытию всей закрытой реализации класса.
Поскольку ООП является наиболее используемой сегодня методологией проектирования (я полагаю?), должно быть что-то, что я упускаю из виду в отношении этих проблем. Я обсуждал это со своими коллегами, которые также занимаются легкой разработкой, и у них тоже были точно такие же проблемы с ООП. Может быть, именно этот структурированный опыт программирования мешает нам понять все преимущества ООП как чего-то большего, чем предоставление методов для установки и получения частных данных, чтобы они изменялись и извлекались из одного места.
Заранее спасибо, надеюсь, я не слишком похож на идиота. Для тех, кому действительно нужно знать языки, связанные с этим дизайном, это Java на стороне сервера и ActionScript 3 на стороне клиента.