|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.08.2015, 15:45 | #1 |
Заблокирован
Регистрация: 03.08.2015
Сообщений: 28
|
Как запрограммировать поле сапера используя ООП?
Мне сказали что я не разбираюсь в ООП, учу.
Пытаюсь сделать солвер для сапёра. До этого момента я всё делал в одном классе, сейчас создал ещё один, для поля сапёра. Для вот такого: Для хранения этого поля я создал класс Field, который внутри - двухмерный массив классов Cell. Cell - число _number плюс геттеры сеттеры и немного вспомогательных методов. Следующий шаг - добавить итерацию по всем ячейкам этого поля, и отложить нужные ячейки в список до лучших времен. Здесь начинаются "проблемы". Я не уверен, делать Cell классом или структурой. Как я понял, разница между классом и структурой в том, что структуры всегда передаются целиком, а для классов передаётся только ссылки-указатели на них. Структура не будет так мучить сборщик мусора, поэтому это звучит как более удачное решение. Если всё оставить по-простому, и делать доступ к нужной ячейке по её икс и игрек координатам, тогда итератор должен возвращать только икс игрек координаты вместо самих ячеек, и я должен запоминать сами координаты вместо конкретных Cell объектов. Не очень красиво. Если всё сделать в лоб, то можно чтобы каждая Cell ещё и хранила свои координаты. Но это дублирование данных. Если Ячейка будет классом, то можно сделать так, что итератор будет возвращать ссылки на эти ячейки, и список будет эти ссылки сохранять. Если потребуется узнать координаты ячейки, можно будет пройтись по всему Полю и сравнить каждую Ячейку с нужной. В C# ведь есть сравнение объектов на "одинаковость", что это один и тот же объект? Но это наверное не достаточно быстро. Можно сделать чтобы итератор возвращал и Ячейку и координаты. Однако yield return не может возвращать более одной переменной за раз? Хотя можно и создать новый класс CellWithCoordinates только для этого. Мне нужен совет. |
03.08.2015, 20:29 | #2 | |||
Форумчанин
Регистрация: 27.01.2014
Сообщений: 115
|
Ну и примерчик
ООП не начинается с решения проблем доступа к данным. ООП - это подход, при котором приложение представляется в виде объектов и их взаимосвязей. http://habrahabr.ru/post/147927/ http://habrahabr.ru/hub/oop/ http://professorweb.ru/my/csharp/cha...level3/3_1.php Например, первый объект - игрок (счет, статистика, набор последних действий). Ячейка, хранящая данные о своем состоянии. Поле, набор ячеек, функционал для рандомного размещения мин, установка состояний ячеек и проч. Приложение - реализация игры. Это если не особо вникать в суть вопроса. Цитата:
Цитата:
Цитата:
Замените тип данных int на любой другой, в частности, если вспомнить основы-основ программирования - структура и, в целом, класс, это составные типы данных. Понимаете, что вы можете вернуть ссылку на любой набор данных, особенно если он составной? Последний раз редактировалось Akeloya; 03.08.2015 в 20:33. Причина: ыф |
|||
03.08.2015, 22:30 | #3 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
IComparer более нужен для сортировки. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
03.08.2015, 23:04 | #4 |
Заблокирован
Регистрация: 03.08.2015
Сообщений: 28
|
В сишарпе возможно определить, что вот этот объект является именно этим объектом, а не очень похожим на него объектом с одинаковыми полями? Более строгое равенство, как это назвать лучше. Что две переменные ссылаются на один и тот же объект.
yield return не может зайелдить несколько переменных за раз? foreach (var x, y in AllCoordinates()) |
04.08.2015, 08:24 | #5 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
есть ReferenceEqual равенство ссылок.
так же можно переопределить object.Equals что он проверял на точное равенство. вы можете возвращать структуру Point например. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
04.08.2015, 09:22 | #6 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
Ну и как бы обычное равно (a == b) для объектов работает именно так - проверяет равенство ссылок. Если не переопределен оператор сравнения. И не надо никаких Equals и IComparer.
Изобретатель велосипедов
|
04.08.2015, 10:38 | #8 |
Заблокирован
Регистрация: 03.08.2015
Сообщений: 28
|
Знаете что, я сделаю для них вот такой интерфейс, а дальше пусть крутится как хочет. Мне должно быть без разницы что там внутри.
Код:
Стоп, если я сделаю редактирование Поля через Ячейку, мне придётся делать внутреннее состояние Поля как public. Но как тогда сделать, чтобы никто не мог менять состояние Поля напрямую, в обход Ячейки? Как-то объявить переменную внутри Поля как [accessableOnlyFrom(Cell)]. Я вообще знаете как всё это себе представляю? Как граф зависимости классов, который не просто нарисован где-то там на бумаге, а который есть прямо на мониторе, привязан к коду, и который проверяется на корректность при изменении кода. Чтобы неправильный доступ подчёркивался прямо в IDE. Интересно, кто-нибудь уже сделал такое? Это кажется базовой функциональностью, почему никто ещё не сделал этого? И вообще мне нужны утилиты по визуализации кода, как можно нагляднее и работающие и для чужого кода. И ещё для парсинга и быстрого модифицирования. Надеюсь вы знаете что-нибудь такое. И надеюсь ответите побыстрее, ждать от (большинства из) вас двух предложений два дня несколько... ПРАВКА: Мне нашлось nested classes, думаю самое оно. Не самое гибкое решение, но для этой задачи будто создано. Для задач посерьёзней надо бы какой-то контроль доступа более настраиваемый. Что делать с кодом для дебага? Я там добавил немного мелочи вроде месседжбоксов, чтобы посмотреть как оно работает. Удалять жалко, потом может понадобиться. В комментариях держать как-то тоже не очень, надо чтобы студия всё видела. Нерешительность. Может в if(false) поместить? Никогда не выполняющийся код помещается в ехе, или оптимизируется в ничто? Как там посмотреть на сгенерированный код и что-то понять? Хотите на код посмотреть? Покритиковать там, всё такое. Последний раз редактировалось Stilet; 10.09.2015 в 11:58. |
05.08.2015, 21:44 | #9 |
Заблокирован
Регистрация: 03.08.2015
Сообщений: 28
|
Надо бы это на Enum переделать. Наверное.
Код:
Строки использую тогда, когда надо изменить или сравнить значение ячейки. Например, бомба там в 5,14 или флаг. А ещё я всё поле через МесседжБокс вывожу, используя именно строки. Удобно, но криво - шрифт не моноширинный, и я не знаю как это исправить. Цифры для хранения. И так чуть проще узнать, число находится в ячейке, или например ячейка ещё не раскрыта. Если больше или равно 0 - значит цифра. Там ещё кучка геттеров и сеттеров, которые показывают ячейку нужным боком по требованию. Когда надо - строка, когда надо - цифра. Поначалу мне это показалось хорошей идеей, сейчас я в этом сомневаюсь. Люблю эту скорость. Вас 7 миллиардов, но вы шевелитесь так медленно. Статическая переменная, установленная в null, и проверка на null перед первым использованием работает так же как синглтон. Однако синглтон проверяет перед любым обращением, без него проверка должна быть скопипащена перед каждым обращением к переменной. Ненавижу выбор. Выбирать сложно. Почему есть так много решений, как выбрать лучшее? Последний раз редактировалось Stilet; 10.09.2015 в 11:59. |
05.08.2015, 23:54 | #10 | ||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
Цитата:
Цитата:
обычно это редко нужно. вы можете инкапусировать достаточно. например имея модификатор internal у set-тера свойства вы сможете присвоить значение только из той же сборки(проекта) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 05.08.2015 в 23:57. |
||||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Используя ООП создать в динамической памяти фигуру, представляющую связный список отдельных объектов (C#) | BaHDaJl | Помощь студентам | 0 | 20.06.2012 15:42 |
Добавить в XML дополнительное поле используя appendChild. | Alfiks | Microsoft Office Excel | 1 | 14.03.2011 12:59 |
Как можно используя IdHttp обратиться к серверу по IP не используя доменное имя. | Chasow | Работа с сетью в Delphi | 1 | 06.04.2010 04:16 |