vldmrmlkv
@vldmrmlkv
Systems engineer

Как реализовать зависимость аргумента одного класса от другого класса?

Выдуманный упрощенный пример. Допустим есть класс Car, в котором есть аргумент tanker_path(НЕбак, а расстояние) где считается сколько хватит бензина. И есть отдельный класс Road, в котором есть аргумент length - длина дороги. Car.tanker_path - будет зависеть от Road.length.

Как такую зависимость правильно реализовать? Так делают или это изначально неправильная схема?

Самый простой вариант вижу такой - выносить переменную length в глобальную область. Пока писал ещё один вариант придумал - в классе Car нужен отдельный аргумент, например Car._road где значением будет другой класс Road(композиция?), откуда уже и будет браться длина дороги

class Ship:
    def __init__(self, x=None, y=None):
        self.x, self.y = x, y  # нужна проверка, будет ошибка если не влезает в Space.size


class Space:
    def __init__(self, size):
        self.size = size
        

sp = Space(50)
sh = Ship(100, 100)  # должна быть ошибка т.к. не влезает в пространство
  • Вопрос задан
  • 170 просмотров
Решения вопроса 2
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Соглашусь с предыдущими комментаторами, пример СЛИШКОМ высосан из пальца, чтобы по нему давать какие-то рекомендации.
Но в целом, бак должен быть отдельным объектом в составе машины, а никаким не "аругментом".
И у него может быть метод consumeFuel(miles)
Который может принимать длину дороги в качестве аргумента, и уменьшать количество топлива в соответствии с заложенной формулой.

Car.Tank.fillMax()
print Car.Tank.getLevel()
Car.Тank. consumeFuel(Road.length)
print Car.Tank.getLevel()

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

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

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

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

В одном соглашусь с ними: никогда не нужно делать два дела одновременно: и решать конкретную задачу, и учить новые концепции.
Поэтому лучшим вариантом написания кода будет такой: сначала наговнякать процедурный, но рабочий вариант.
А потом заняться его рефакторингом: посмотреть, какие можно использовать классы, как они могут взаимодействовать.
Ответ написан
vabka
@vabka
Токсичный шарпист
в примере с кораблём и пространством можно использовать паттерн "фабрика".
Делаешь третий класс, в нём поле, которое содержит Space, и метод который будет принимать координаты нового корабля и возвращать созданный экземпляр. В этом методе и будет проверка.

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

В любом случае, в отрыве от конкретной задачи, вопрос смысла не имеет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Krawler
С# разработчик
Если вопрос "в общем случае", то тут стоит прочитать про разные отношения между классами. Подробнее, например, здесь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы