Найти - Пользователи
Полная версия: Требуется оценка.
Начало » Python для новичков » Требуется оценка.
1 2
FishHook
py.user.next
Мы видим, что проблема в функции acquaintance() - она просто держит ограничения, изначально взятые с потолка (писалась она явно не для этого применения).

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

Смотрите, как-то так

    
class Cat:
     can_eat_max = 5
     can_play_max = 10 
   
class Dog:
    can_eat_max = 15
    can_play_max = 20 
   
def play(pet, minutes):
   if minutes > pet.can_play_max:
       print("fail")

Или как-то так

    
class Pet:
    def play(self, minutes):
           if minutes > self.can_play_max:
               raise Error()
   
class Cat(Pet):
     can_play_max = 10 
  
def play(pet, minutes):
  try:
      pet.play(minutes)
  except Exception as e:
      print(e)

конкретная архитектура классов не столь важна, важен принцип - внешний код не должен управлять внутренним состоянием объекта и знать об его внутреннем устройстве. Ваша функция acquaintance задает ограничения для методов объектов, это очень плохо.
py.user.next
FishHook
Где py.user.next увидел побочки я не нашел
Побочный эффект в вводе с консоли и выводе на консоль. Если надо будет вводить данные из файла и выводить в файл, что автор будет делать? Правильно, писать новый класс. А почему он будет писать новый класс? Потому что при выводе в файл, эти методы будут ещё и в консоль писать то, что не нужно туда писать, а при вводе из файла эти методы ещё застынут, ожидая ввода с консоли, когда его не будет. Так что это и есть причина написания чистых функций - чтобы просто банально не писать сто похожих кодов, когда можно написать один и использовать его потом как в одной программе, так и в разных.

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

Babay82
Или ты на форуме для новичков чтобы ядом поплеваться
Ты спросил по коду “дайте оценку” - я тебе кратко написал “детский лепет”. Почему же я тебе написал так и почему это очень кратко - потому что по факту тебе нужно сюда переписывать до буквы несколько учебников, так как ты не читал из них ни строчки. Не умея писать даже простые функции (а методы - это функции), ты взялся за следующий этап, ООП и околоООП, где всё это уже надо знать. Когда же ты попросил подробностей, я тебе дал более развёрнуто, но ты опять ничего не понял, потому что у тебя знаний нет и для понимания этого уровня. С чего ты взял-то, что программирование можно изучать с любой точки? Это не литература или история, где можно начинать изучение с любого автора и любого периода, разницы нет. Это ближе к математике, где сначала изучают таблицу умножения, а уже потом изучают квадратные уравнения, не наоборот.
FishHook
py.user.next
Побочный эффект в вводе с консоли и выводе на консоль. Если надо будет вводить данные из файла и выводить в файл, что автор будет делать? Правильно, писать новый класс.
Я бы сказал, что это нарушение принципа единичной ответственности, но ИМХО топикстартеру до SOLID еще далеко.
py.user.next
FishHook
нарушение принципа единичной ответственности
Это ошибка зацепления модулей. Из СП понятие. То есть у него класс знает про консоль, хотя должен только общаться с внешним миром через сообщения, в том числе и с консолью (напрямую или опосредованно).

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

Если правильно написать класс, то он сможет:
- брать ввод из сокета, а ответ выводить на веб-сайт
- брать ввод с веб-сайта, а ответ выводить на сокет
- брать ввод из одного файла, а ответ выводить в другой файл
- брать ввод из файла, а ответ выводить в базу данных PostgreSQL

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

Один раз написал класс и он настолько общий, что может быть применим в любых программах с любой функциональностью и без каких либо изменений самого класса. Теперь представим, что таких классов, как этот один, у нас десятки, сотни, - понятно, что переписывать сотни классов не хватит времени, а их используемость (повторная используемость, reuse) зависит только от того, как мы их написали тогда, в первый раз. От этого зависит, как мы будем писать новую программу - с нуля всё делать несколько месяцев или же накидать такую же по объёму программу за один день, взяв готовые классы из разных программ и соединив их вместе.
Babay82
FishHook
По поводу
  def __pass_time(self):
        self.hanger += 3
        self.boredom += 3
Это метод непосредственно из изначального кода автора учебника, если моя ошибка в том , что я его не задокументировал - каюсь.
Дальше обращаюсь ко всем. По поводу - затеять возню со стат.методами, создать отдельный класс, выводов в консоль, общалки и т.д. - повторюсь: это задание после главы по созданию базовых классов. Создание классов на основе классов, взаимодействие между классами и экземплярами классов, наследование в общем само ООП прочая будет дальше. Я с этим пока не знаком. С выводом в консоль та же история, автор ПОКА всю работу ведет через консоль, о других способах автор расскажет дальше, надеюсь.
Если проблема не в самом нахождении сторонней функции в методе объекта, а в самой функции, что она влияет на работу метода. То учитывая, что функция существует только для того , что бы предотвратить ошибку пользовательского ввода, допустим ли такой вариант( хотя лучше наверное функцию вывести вовне и передавать параметр в качестве атрибута в метод):
 def ask_number(question):
    response = None
    while not response:
        try:
            response = int(input(question))
        except (TypeError, ValueError):
            print("Недопустимый ввод")
 def eat(self):
        food = ask_number("Сколько корма вы хотите дать питомцу?")
        if food > 10:
            print("Я переел и меня стошнило")
        else:
            print("Мрр...Спасибо!:)")       
            self.hanger -= food
            if self.hanger < 0:
                self.hanger = 0
        self.__pass_time()
        
    def play(self):
        fun = ask_number("Сколько времени вы потратите на игру с питомцем?")
        if fun > 15:
            print("Вы меня переутомили")
        else:
            print("Wowww!!!")       
            self.boredom -= fun
            if self.boredom < 0:
                self.boredom = 0
        self.__pass_time()
py.user.next
Почему же я тебе написал так и почему это очень кратко - потому что по факту тебе нужно сюда переписывать до буквы несколько учебников, так как ты не читал из них ни строчки. Не умея писать даже простые функции (а методы - это функции), ты взялся за следующий этап, ООП и околоООП, где всё это уже надо знать. Когда же ты попросил подробностей, я тебе дал более развёрнуто, но ты опять ничего не понял, потому что у тебя знаний нет и для понимания этого уровня. С чего ты взял-то, что программирование можно изучать с любой точки? Это не литература или история, где можно начинать изучение с любого автора и любого периода, разницы нет. Это ближе к математике, где сначала изучают таблицу умножения, а уже потом изучают квадратные уравнения, не наоборот.
Не пойму , что тебя так зацепило? Я пытаюсь чему то научиться по самоучителю, что-то по мере необходимости черпаю из других источников, прежде чем перейти к следующему этапу прошу вас проверить усвоенный материал, если что не так указать ошибки, теоретически, я мог бы молча себе “чему то” спокойно научиться, начать что то разрабатывать, возможно он даже работало бы(эта же работает), принося время от времени головную боль(скорее всего только мне), но работало бы через ж… и с такой же живучестью. Таких не мало судя по форумам и статьям на хабре(и не только). Но я понимаю что я могу что то не понять, или понять не так, или интерпретировать по своему. Поэтому и обратился к вам. Что -бы подсказали ошибки, А “детский лепет” слишком обобщающая подсказка. Неохота плодить г….
Спасибо.Надеюсь вы не зря потратили на меня свое время.
FishHook
Babay82
повторюсь: это задание после главы по созданию базовых классов. Создание классов на основе классов, взаимодействие между классами и экземплярами классов, наследование в общем само ООП прочая будет дальше. Я с этим пока не знаком
Мужик, ты чего от нас хочешь то? Ты попросил дать оценку, тебе дали оценку. Ты предлагаешь вслед за тобой читать твои учебники и вникать, что ты знаешь, а чего не знаешь?
Babay82
Я пытаюсь чему то научиться по самоучителю
Нет. Ты пытаешься научиться по самоучителю + форум. Самоучителя тебе, очевидно, не хватает.
Babay82
Но я понимаю что я могу что то не понять, или понять не так, или интерпретировать по своему. Поэтому и обратился к вам.
Задавай конкретные вопросы, получишь конкретные ответы. Если хочешь учиться по программе, тогда иди поступай в вуз, нанимай репетитора или покупай онлайн курсы бесполезные и идиотские, тогда у тебя будет наставник, который в курсе твоих компетенций и будет тебя нежно наставлять и направлять в рамках учебного материала за уплоченные ему деньги. От форума ты чего хочешь? Чтобы тебя бесплатно учили? Такого не бывает. Был задан вопрос, был получен ответ. Если ты не понимаешь ответа по недомыслию или потому что твоя программа самообразования построена не лучшим образом, ну это недостатки самообразования, ты сам выбрал этот путь.
py.user.next
Babay82
Изучаю язык(да и в принципе программирование) по книге М.Доусона.
Думаю, дело всё-таки в этом. Сколько видел учащихся по книге Доусона (Babay82 десятый уже, не меньше), так вечно фигню какую-то пишут и спрашивают. А начинают с неё полные новички, чтобы научиться чему-то ощутимому. Им кажется, что через неё они войдут в ООП, используют её как введение в ООП для новичков.

Babay82, думаю, ты теряешь время на этой книжке. Ты ничему не научишься, ничего не поймёшь, ещё и перессоришься со всеми из-за непонимания (хоть на Хабре->Тостере, хоть где).

Меняй программу обучения, не бывает ООП с лёту. Сначала надо пройти самые основы, потом, имея базовое понимание основ, пройти уже продвинутые основы, потом пройти доООПэшные парадигмы и только потом уже в ООП заходить и в ФП. Сказки про неправильное мышление между СП, ООП и ФП - это просто сказки, знать нужно всё и применять совместно. Проседаешь ты по обычным функциям и не умеешь их склеивать между собой и собирать в модули, которые тоже потом взаимодействуют между собой через интерфейсы.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB