Python: 클래스의 주석 1 "추상도"

부품 사용법부터 조합 방법까지 정보


단순히 프로그램의 단편을 이용하는 것이 아니라 그들의 프로그램을 조합한 설치 추진 학습을 대상으로 한다.

현재 상태


그걸 하고 싶고, 이걸 하고 싶은 작은 생각은 풍부한 라이브러리와 해설 덕분에 이루어질 수 있었다.다른 한편, 그것들을 조합해서 프로그램을 만들려면 어쨌든 전체가 엉망진창이 되어 머지않아 착수할 수 없을 것이다.
따라서 여기서 학급에서 배운 것을 정리하고'자신이 확장할 수 있고 구성원의 절차'를 만드는 것을 목적으로 각종 사항을 정리한다.초보자의 틀을 벗어나지 못하는 프로그래머이기 때문에 환영합니다.

유추상


정확한 추상도 설정


프로그램에서 이름은 매우 중요하다.적당한 이름을 지으면 이해와 인식을 저해한다.따라서 전체적인 상황을 잘 파악하기 위해서는 상황에 따라 추상도를 결정해야 한다.

추상도


"Python 클래스 추상도"등을 검색하면 클래스 사용 방법에 대한 정보가 대부분을 차지합니다.의외로 이해하기 어려운 부분이다.
예를 들어 고전적인 서양 판타지 캐릭터 게임을 만드는 상황을 상상해 보자.마을 주민 존 캐릭터를 다루는 반을 만들 때 도대체 어떤 이름을 지어야 할까.
우선 전제로 세계의 각양각색의 물건은 동시에 여러 그룹에 속한다.물론 존도 예외는 아니다.

대충 생각해봐도 존은 이름이 여러 개 있다.Object는 게임에 존재하는 모든 물체(지면, 나무, 건축물, 캐릭터 등)입니다.생물과 무생물 중에서 생물의 Creature입니다.일반인 외에도 정령과 드워프 등이 포함된 인간형 생물 Humanoid.인간 생물에서...계속 걸어가다가 마을 주민 존에게 도착했다.

너무 높은 추상도


'어쨌든 생물로 Creature부터 만들자'고 하면 다음과 같은 설치가 된다.
creature.py
class Creature:
    def __init__(self, hp, mp, start_position, area):
        self.hp = hp
        self.mp = mp
        self.position = start_position
        self.area = area
        self.oxygen = 100

    def move(self, next_position):
        if self.area == "land":
            self.walk()
            self.position = next_position

        elif self.area == "water":
            self.swim()
            self.position = next_position

        elif self.area == "sky":
            self.fly()
            self.position = next_position

    def walk(self):
        print("てくてく")

    def swim(self):
        print("すいー")

    def fly(self):
        print("びゅーん")
Creature의 총결이기 때문에 적어도 지상에서 생활하는 생물, 물속에서 생활하는 생물, 공중에서 생활하는 생물은 분리되어야 한다.지상에서 생활하는 생물이 물에 들어갈 생각을 하면 산소량을 관리해야 한다고 느낀다.공중에서 생활하는 생물의 무게 관리가 중요하다고 한다.
그리고 이번에 생각한 것은 환상의 세계이기 때문에 장기에 오염된 마계에 사는 생물이 나타날 수도 있고, 빛이 비치지 않는 지하에 사는 생물이 나타날 수도 있다.이와 동시에 다른 이동 방법과 자신의 상태 설정 등 가속도로 실행해야 할 것들이 끊임없이 증가할 것을 예견할 수 있습니다.

추상도가 너무 낮다


'뒷얘기는 하지 말고 마을 사람들로 정리하자'고 생각하면 다음과 같은 실현이 있을 것이다.
villager.py
class Villager:
    def __init__(self, name, hp, start_position):
        self.name = name
        self.hp = hp
        self.position = start_position

    def move(self, next_position):
        self.position = next_position
        print("てくてく")

    def speak(self, line="こんにちは。ここは始まりの村だよ"):
        print(f"{self.name}{line}」")

villagerA = Villager("John", 100, [0,0])
villagerA.speak()
villagerA.speak("どちらからいらしたのかな?")

#実行結果
'''
John「こんにちは。ここは始まりの村だよ」
John「どちらからいらしたのかな?」
'''
아까와는 달리 마을 사람들만 대상으로 하기 때문에 설치해야 할 물건들을 생각하면 편해요.NPC로 처리하면 이 방면에서 적당히 헤매고 말을 걸면 적당한 대사를 하면 된다.
다른 한편, 순조롭게 설치될 수 있다면 욕심이 날 것이다.예를 들어 성곽 도시를 건설하고 NPC를 배치하는 것을 고려할 때 이 Villager는 조금만 하면 사용할 수 있다.움직이면서 말하는 기본 기능은 변하지 않기 때문이다.
앞으로의 확장성을 고려하면 역시 Villager라는 이름이 가장 적합하다.거주 구역을 한층 더 세분화하거나 각 거주 구역에 특성을 부여해 보자.변주곡을 가져와 불가능한 아이를 공격하기 위해 반대로 공격이 가능한 깡패를 만드는 것은 그런 확장이다.

적당한 추상도


그렇다면 높지도 낮지도 않은 적당한 추상도를 유지한 이름은 무엇일까?규격에 따라 얼마든지 변할 수 있지만 타당한 점은 다음과 같다.
resident.py
class Resident:
    def __init__(self, name, hp, start_position):
        self.name = name
        self.hp = hp
        self.position = start_position

    def move(self, next_position):
        self.position = next_position

    def speak(self, line="こんにちは"):
        print(f"{self.name}{line}」")

citizenA = Resident("John", 100, [0,0])
citizenA.speak()
villagerA = Resident("Mary", 100, [0,10])
villagerA.speak("こんにちは。ここはサウスシティですか?")

#実行結果
'''
John「こんにちは」
Mary「こんにちは。ここはサウスシティですか?」
'''
어딘가에 사는 존재라서 Resident라는 이름을 지어봤어요.이렇게 되면 마을 주민과 시민이 모두 포함된다.가능하다면 공중도시 시민을 만들 수 있을지도 모른다.

총결산


추상도를 높이면 설치해야 할 물건이 늘어난다.교통수단의 경우 자동차가 아닌 Transportation으로 설치하면 비행기와 배를 포함해 설치량이 늘어난다.
다른 한편, 추상도를 낮추면 실현해야 할 것은 줄어들지만 사용할 수 있는 범위는 당연히 작아진다.마찬가지로 교통수단을 예로 들면 자동차가 아닌 버스를 설치하면 고려해야 할 범위가 좁아지고 설치가 수월해지겠죠.다른 한편, 같은 손님을 탑재한 택시의 응용을 감안하면 또 다른 시간이 필요하다.
  • 추상성이 너무 높으면 설치물을 늘려야 한다
  • 추상도가 너무 낮으면 다른 사용에 공을 들인다
  • 잡담


    다음에 추상적인 기류, 계승과 합성, 양도에 대해 총괄할 것이다.

    좋은 웹페이지 즐겨찾기