Форум сайта python.su
py.user.nextБьюсь об заклад, что на весь этот текст вы потратили больше времени чем потратили бы на набросок программы. И всем было бы понятно о чем идёт речь, достаточно было бы глянуть на ваш код и на мой и сравнить. Но, и на этом спасибо. Ваши мысли действительно здравые и приносят людям пользу. Хочу лишь заметить, что здание возводят с фундамента. Будет фундамент значит будет и крыша, не будет фундамента нет смысла изучать стропильную систему и плевать как там ляжет мауэрлат потому что здание все равно либо не достроится либо рухнет.
Если бы у меня было время писать, я бы написал.
Офлайн
m1r42В программе смысла нет, в тексте - есть. Когда сюда будут приходить периодически реально интересующиеся тем, что такое ООП и что такое не ООП, то я буду по своим тегам находить эти сообщения свои и направлять этих интересующихся на эти свои сообщения, чтобы это всё по второму, третьему, десятому разу не писать. Поэтому я их так готовлю хорошо, вычищаю от ошибок, проясняю неясности и так далее.
Бьюсь об заклад, что на весь этот текст вы потратили больше времени чем потратили бы на набросок программы.
Отредактировано py.user.next (Янв. 29, 2023 10:37:19)
Офлайн
py.user.nextДумаю, что с таким подходом можно всю жизнь думать, но так ничего и не сделать. Проблема в том, что есть ограниченное количество времени на выполнение той или иной задачи и с этим ничего не поделать, время не остановишь. В середине декабря передо мной стояла задача до НГ ввести в работу программу по учету оборудования и ремонтов в моей организации. Две недели ушло на написание базовой версии 1.0. Сейчас конец января, программа уже умеет многое, что изначально даже не задумывалось, но в процессе разработки выяснилось, что можно использовать накопленные в БД данные для многих других целей. Версия уже выросла до 1.7 т.е. сделано уже 7 релизов после ввода в эксплуатацию и пока я не столкнулся с ошибками проектирования, т.е. столкнулся, но это легко решилось. Но ведь я мог бы изначально продумать всё что мне будет необходимо и сразу сдалеть “правильно”, увы неуспев запустить в работу программу к сроку. За полтора месяца проект вырос до 5000 строк и вырастет еще больше, так как появляются новые задумки по применению данных которые накапливаются в БД. Да, сейчас я смотрю на свой проект уже другими глазами. Знаю, что есть недочеты, но я получил опыт и в следующем проекте он мне пригодится. Если бы я учился только по книгам, а не на опыте, то скорей всего из под моей клавиатуры еще не вышло бы ни одной полезной программы.
Ты вот когда делаешь объект, придумываешь его, какие у тебя критерии того, какие в нём методы должны быть, а каких методов в нём быть не должно?
Офлайн
py.user.nextЭто имелось ввиду?
Да ты не сможешь просто даже добавить туда логирование, просто физически не сможешь.
import inspect class Object(object): def save_log(self): print(inspect.getmembers(self, lambda myVar: not(inspect.isroutine(myVar)))) class Game(Object): def __init__(self): self.board = [['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-'], ] def make_move(self, x, y, symbol): """Делать ход""" if self.board[x][y] == '-': self.board[x][y] = symbol self.save_log() else: return False self.checking_the_board() return True def show_board(self): """Вывод доски в консоль""" for item in self.board: print(item) def checking_the_board(self): """Проверка доски""" pass class AI(Object): def __init__(self, game): self.game = game def step(self): stop = False for row in range(3): if not stop: for column in range(3): if self.game.board[row][column] == '-': self.game.make_move(row, column, '0') self.save_log() stop = True break else: break game = Game() a = AI(game) while True: game.show_board() x = input('X >>> ') if x != 'q': y = input('Y >>> ') if y != 'q': if game.make_move(int(x), int(y), 'X'): print('ход сделан') a.step() else: break else: break
Офлайн
m1r42Да, типа такого.
Это имелось ввиду?
m1r42Ну да, программы не заканчиваются там на каких-то версиях. Они растут дальше. А чтобы они росли правильно, а не как икебана буквой зю, надо их правильно проектировать, иначе программа может врасти в саму себя и ты потом нихрена не сможешь сделать с этим, она прямо саму себя заблокирует. А чтобы их правильно проектировать, надо знать, как это делать вообще. А для того, чтобы знать, как это делать вообще, надо читать книжки от тех авторов, которые это всё изучили и прошли. Лучше учиться на чужих ошибках, чем, изобретая уже изобретённый велосипед, всему перетравмироваться от и до, пока понимаешь, как он там должен быть сделан, чтобы на нём именно ездить, а не падать с него.
За полтора месяца проект вырос до 5000 строк и вырастет еще больше
Отредактировано py.user.next (Янв. 29, 2023 11:38:57)
Офлайн
py.user.nextЗнаете, с вами дискутировать одно удовольствие. Я о многих вещех узнал именно из дискуссий с вами. Это очень круто. Снимаю шляпу, сэр. Я конечно задумывался о логгировании, но даже не знал с какой стороны подойти к процессу, а тут прямо меня осенило. Все гениальное просто, надо только найти подход к этому самому гениальному.
Да, типа такого.
import logging logging.basicConfig(level=logging.INFO, filename="py_log.log", filemode="w", format="%(asctime)s %(levelname)s %(message)s") class Object(object): def save_log(self, *args): logging.info(args) class Game(Object): def __init__(self): self.board = [['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-'], ] def make_move(self, x, y, symbol): """Делать ход""" if self.board[x][y] == '-': self.board[x][y] = symbol self.save_log(x, y, symbol) else: return False self.checking_the_board() return True def show_board(self): """Вывод доски в консоль""" for item in self.board: print(item) def checking_the_board(self): """Проверка доски""" pass class AI(Object): def __init__(self, game): self.game = game def step(self): stop = False for row in range(3): if not stop: for column in range(3): if self.game.board[row][column] == '-': self.game.make_move(row, column, '0') stop = True break else: break game = Game() a = AI(game) while True: game.show_board() x = input('X >>> ') if x != 'q': y = input('Y >>> ') if y != 'q': if game.make_move(int(x), int(y), 'X'): print('ход сделан') a.step() else: break else: break
Отредактировано m1r42 (Янв. 29, 2023 12:20:08)
Офлайн
py.user.nextНо это же код на коленке, естественно он из рода говнокодов, с целью на базовом уровне объяснить человеку, что прежде чем нагружать свою программу непонятными классами и аргументами, стоит задуматься, а надо ли все это, а можно ли сделать все проще, чтобы можно было смотреть в код и без каких-либо комментариев его понимать, в игры то я не играю (исключение HoMM III, который уже порядком надоел) вот и развлекаю в выходной день моск как могу.
Там у тебя должен быть объект Доска, объект ИИ, объект Игра. И вот этот цикл должен быть в объекте Игра. Объект Игра также должен выполнять операции над объектом Доска и над объектом ИИ. В объекте Игра их можно хранить в качестве свойств объекта Игра. Естественно, все классы этих объектов наследуются от класса Object. А класс Игра ещё не факт, что это конкретный класс, а не абстрактный класс для создания разных видов игр.
Офлайн
py.user.nextДумаю, там ещё должен быть объект Судья и объект Доска с результатами. И вот объект Игра содержит все эти вещи в себе и управляет ими, выполняя операции над ними и связывая их между собой.
Там у тебя должен быть объект Доска, объект ИИ, объект Игра. И вот этот цикл должен быть в объекте Игра. Объект Игра также должен выполнять операции над объектом Доска и над объектом ИИ. В объекте Игра их можно хранить в качестве свойств объекта Игра. Естественно, все классы этих объектов наследуются от класса Object. А класс Игра ещё не факт, что это конкретный класс, а не абстрактный класс для создания разных видов игр.
m1r42Я вот тебе и говорю, что классы являются непонятными и вообще всё ООП является непонятным именно тогда, когда человек в них не разбирается, когда человек не умеет делать ООП. Вот тогда это и превращается в кашу и в ненужный бред, который хочется просто выкинуть и сделать всё попроще. Но оно и не для новичков, я тебе так скажу. Потому что ООП дополняет структурную парадигму программирования, а не заменяет её. То есть вот это примитивное всякое программирование, программирование без ООП, тебе уже нужно знать к тому времени, когда ты ООП изучать собрался. Поэтому новичком, который не знает, как правильно написать крестики-нолики вообще хотя бы как-то, нельзя быть. Нужно обязательно иметь опыт. Поэтому я вот и не поддерживаю такие подходы, когда новичков сразу на ООП кидают и начинают их там типа учить с такими типа лозунгами “вот мы сейчас им правильные мозги сразу сформируем, они не будут знать старых стилей, они не будут писать по-старому там, где нужно в ООП писать”. Это бред полный. Не знать Кнута, не знать сортировку пузырьковую - это такая бредятина. Потом начинается, что он пишет в ООП (ну, якобы в ООП, как его там убедили), но при этом простой массив перебрать не может вообще, потому что не умеет границы у массива определять, не знает, что такое массив с элементами и где там элементы и сколько их там и так далее. Ему нужен итератор, потому что без итератора у него сразу ступор и всё.
нагружать свою программу непонятными классами и аргументами
Отредактировано py.user.next (Янв. 29, 2023 20:28:12)
Офлайн
m1r42Я думаю, ты Board (класс Доска) назвал Game'ом (класс Игра). Потому что методы там от Board'а. Назови её Board обратно. А Game создай дополнительно и в Game засунь метод, в котором и будет этот цикл while, который у тебя там внизу.
Я конечно задумывался о логгировании, но даже не знал с какой стороны подойти к процессу
Отредактировано py.user.next (Янв. 29, 2023 20:44:52)
Офлайн