code

파이썬에서 클래스를 설계하려면 어떻게 해야 합니까?

starcafe 2023. 7. 17. 21:17
반응형

파이썬에서 클래스를 설계하려면 어떻게 해야 합니까?

저는 이전 질문들에서 발과 발가락을 감지하는 에 대해 정말 놀라운 도움을 받았습니다. 하지만 이 모든 해결책들은 한 번에 하나의 측정에만 효과가 있습니다.

이제 다음과 같이 구성된 데이터가 있습니다.

  • 약 30마리의 개;
  • 각 측정값은 24개(여러 부분군으로 분할됨)를 가집니다.
  • 각 측정에는 최소 4개의 접점(각 발에 하나씩)이 있습니다.
    • 각각의 접점은 5개의 부분으로 나누어져 있습니다.
    • 접촉 시간, 위치, 총 힘 등과 같은 몇 가지 매개 변수가 있습니다.

alt text

분명히 모든 것을 하나의 큰 물체에 집어넣는다고 해서 그것이 잘리지는 않을 것입니다. 그래서 저는 현재의 많은 기능 대신에 수업을 사용할 필요가 있다고 생각했습니다.하지만 수업에 대한 학습 파이썬의 장을 읽었음에도 불구하고 나만의 코드에 적용하지 못하고 있습니다(GitHub link).

또한 정보를 얻고 싶을 때마다 모든 데이터를 처리하는 것이 오히려 이상하다는 생각이 듭니다.각 발의 위치를 알게 되면 다시 계산할 이유가 없습니다.또한 같은 개의 모든 발을 비교하여 어떤 접촉이 어떤 발(앞/뒤, 왼쪽/오른쪽)에 속하는지 확인하고 싶습니다.기능만 계속 사용하면 엉망이 됩니다.

그래서 이제 저는 제 데이터(마리의 압축된 데이터 링크)를 합리적인 방식으로 처리할 수 있는 클래스를 만드는 방법에 대한 조언을 찾고 있습니다.

클래스 설계 방법.

  1. 단어를 적어주세요.당신은 이것을 하기 시작했습니다.어떤 사람들은 그렇지 않고 왜 문제가 있는지 궁금해합니다.

  2. 이러한 개체가 수행할 작업에 대한 간단한 설명으로 단어 집합을 확장합니다.즉, 여러분이 이것들에 대해 하게 될 다양한 계산들을 적어보세요.30마리의 개, 24개의 치수, 4개의 연락처, 그리고 연락처당 몇 개의 "매개 변수"의 짧은 목록은 흥미롭지만, 이야기의 일부에 불과합니다."각 발의 위치" 및 "같은 개의 모든 발을 비교하여 어떤 접촉이 어떤 발에 속하는지 확인"하는 것이 객체 설계의 다음 단계입니다.

  3. 명사에 밑줄을 그으세요.진짜로.어떤 사람들은 이것의 가치에 대해 논쟁하지만, 저는 이것이 처음으로 OO 개발자들에게 도움이 된다는 것을 알게 되었습니다.명사에 밑줄을 그으세요.

  4. 명사를 검토합니다."매개 변수" 및 "측정"과 같은 일반 명사는 문제 영역의 문제에 적용되는 구체적이고 구체적인 명사로 대체되어야 합니다.세부 사항은 문제를 명확히 하는 데 도움이 됩니다.제네릭은 세부 사항을 생략할 수 있습니다.

  5. 각 명사("접촉", "파우", "개" 등)에 대해 해당 명사의 속성과 해당 개체가 관여하는 동작을 적습니다.이것을 짧게 자르지 마세요.모든 속성.예를 들어 "Data Set contains 30 Dogs"는 중요합니다.

  6. 각 속성에 대해 이것이 정의된 명사에 대한 관계인지 아니면 문자열, 플로트 또는 축소할 수 없는 것과 같은 다른 종류의 "원시적" 또는 "원자적" 데이터인지 확인합니다.

  7. 각각의 행동이나 동작에 대해, 여러분은 어떤 명사가 책임을 지고 있고, 어떤 명사가 단지 참여하는지를 확인해야 합니다.그것은 "변종성"의 문제입니다.일부 개체는 업데이트되고 다른 개체는 업데이트되지 않습니다.돌연변이 개체는 돌연변이에 대한 전적인 책임을 져야 합니다.

  8. 이때 명사를 클래스 정의로 변환할 수 있습니다.일부 집합 명사는 목록, 사전, 튜플, 집합 또는 명명된 튜플이며, 여러분은 많은 일을 할 필요가 없습니다.파생된 데이터가 복잡하거나 수행되는 업데이트/변조 때문에 다른 클래스가 더 복잡합니다.

유닛 테스트를 사용하여 각 클래스를 분리하여 테스트하는 것을 잊지 마십시오.

또한, 수업은 반드시 변동되어야 한다는 법은 없습니다.예를 들어, 변동 가능한 데이터가 거의 없습니다.소스 데이터 집합에서 변환 함수를 사용하여 생성된 파생 데이터입니다.

다음 조언(@S와 유사)로트의 조언)은 "비기닝 파이썬"이라는 책에 있습니다. 초보자에서 전문가로

  1. 문제에 대한 설명을 적습니다(문제 해결 방법).모든 명사, 동사, 형용사에 밑줄을 그으세요.

  2. 명사들을 훑어보고, 잠재적인 수업들을 찾아보세요.

  3. 가능한 방법을 찾아 동사를 살펴보세요.

  4. 형용사를 살펴보고 잠재적인 속성을 찾습니다.

  5. 클래스에 메서드 및 속성 할당

수업을 세분화하기 위해, 이 책은 또한 우리가 다음을 할 수 있다고 조언합니다.

  1. 프로그램이 어떻게 사용될 수 있는지에 대한 시나리오인 일련의 사용 사례를 기록합니다.모든 기능을 커버해 보십시오.

  2. 모든 사용 사례를 단계적으로 검토하여 필요한 모든 내용이 포함되었는지 확인합니다.

저는 TDD 접근법을 좋아합니다...따라서 여러분이 원하는 행동에 대한 테스트를 작성하는 것으로 시작하세요.그리고 통과하는 코드를 작성합니다.이 시점에서, 디자인에 대해 너무 걱정하지 말고, 합격한 테스트 제품군과 소프트웨어만 구입하십시오.만약 여러분이 복잡한 방법으로 하나의 크고 못생긴 수업을 듣게 되더라도 걱정하지 마세요.

이 초기 프로세스 중에 테스트하기 어렵고 테스트 가능성을 위해 분해해야 하는 동작을 발견할 수 있습니다.이는 별도의 클래스가 필요하다는 암시일 수 있습니다.

그럼 재미있는 부분은...리팩토링작업 소프트웨어가 있으면 복잡한 부분을 볼 수 있습니다.종종 행동의 작은 주머니가 분명해져서 새로운 클래스를 제안하지만 그렇지 않다면 코드를 단순화하는 방법을 찾으십시오.서비스 개체 및 값 개체를 추출합니다.방법을 단순화합니다.

만약 당신이 git을 적절하게 사용하고 있다면(git을 사용하고 있지 않습니까?), 당신은 리팩토링 중에 어떤 특정한 분해를 매우 빠르게 실험할 수 있고, 그것이 일을 단순화하지 않는다면 그것을 버리고 되돌릴 수 있습니다.

테스트를 거친 작업 코드를 먼저 작성하면 설계 우선 방식으로는 쉽게 얻을 수 없었던 문제 영역에 대한 통찰력을 얻을 수 있습니다.쓰기 테스트와 코드를 사용하면 "어디서부터 시작해야 하나" 마비를 극복할 수 있습니다.

OOO design의 전체 아이디어는 코드맵을 문제에 맞게 만드는 것입니다. 예를 들어, 개의 첫 발자국을 원할 때 다음과 같은 작업을 수행합니다.

dog.footstep(0)

이 경우 원시 데이터 파일을 읽고 단계 위치를 계산해야 할 수도 있습니다.이 모든 것을 footstep() 기능에 숨겨서 한 번만 발생할 수 있습니다.다음과 같은 것:

 class Dog:
   def __init__(self):
     self._footsteps=None 
   def footstep(self,n):
     if not self._footsteps:
        self.readInFootsteps(...)
     return self._footsteps[n]

[이것은 일종의 캐싱 패턴입니다.처음에는 발자취 데이터를 읽고 나중에는 자기 자신으로부터 데이터를 얻습니다._filename.]

하지만 OOO 설계를 제대로 하는 것은 어려울 수 있습니다.데이터에 대해 수행할 작업에 대해 더 자세히 생각해 보십시오. 그러면 어떤 클래스에 어떤 방법을 적용해야 하는지 알 수 있습니다.

당신의 링크된 코드를 훑어본 결과, 당신은 이 시점에서 Dog 클래스를 설계하지 않는 이 더 나은 것 같습니다.오히려 판다와 데이터 프레임을 사용해야 합니다.데이터 프레임은 열이 있는 테이블입니다.데이터 프레임에는 다음과 같은 열이 있습니다.dog_id,contact_part,contact_time,contact_location뒤에서 을 많이 합니다. Panda는 뒤에서 Numpy 배열을 사용하며 다음과 같은 편리한 방법을 제공합니다.

  • 다음과 같이 개를 선택합니다.my_measurements['dog_id']=='Charly'
  • : 데터저장:my_measurements.save('filename.pickle')
  • 텍스트 파일을 수동으로 읽는 대신 을 사용하는 것이 좋습니다.

명사, 동사, 형용사를 쓰는 것은 좋은 접근법이지만, 저는 수업 디자인이 어떤 데이터를 숨겨야 하는지 묻는 이라고 생각하는 것을 선호합니다.

상상해보세요.QueryDatabase객체:

Query객체는 쿼리를 만들고 저장하는 데 도움이 됩니다. 여기서 핵심은 저장하는 것입니다. 함수가 쿼리를 쉽게 만들 수 있도록 도와주는 것입니다.머물 수 것입니다: 은머수도있습니다물당신▁maybe다있니습:도.Query().select('Country').from_table('User').where('Country == "Brazil"')구문은 정확히 중요하지 않습니다. 이것이 바로 당신의 일입니다. 핵심은 객체가 무언가를 숨기는 것을 도와준다는 것입니다. 이 경우 쿼리를 저장하고 출력하는 데 필요한 데이터입니다.개체의 힘은 개체를 사용하는 구문(이 경우 영리한 체인)에서 비롯되며 개체가 작동하기 위해 무엇을 저장하는지 알 필요가 없습니다.올바르게 수행된 경우Query개체가 둘 이상의 데이터베이스에 대한 쿼리를 출력할 수 있습니다.내부적으로 특정 형식을 저장하지만 출력할 때 다른 형식(Postgres, MySQL, MongoDB)으로 쉽게 변환할 수 있습니다.

▁the▁through다를 통해 생각해 보겠습니다.Database물건.이것은 무엇을 숨기고 저장합니까?분명히 데이터베이스의 전체 내용을 저장할 수 없습니다. 데이터베이스가 있는 이유입니다!그렇다면 요점은 무엇입니까?목표는 데이터베이스가 작동하는 방식을 사용자로부터 숨기는 것입니다.Database물건. 은 내부 할 때 입니다.좋은 수업은 내부 상태를 조작할 때 추론을 단순화할 것입니다.이를 위하여Database네트워킹 호출, 일괄 쿼리 또는 업데이트, 캐싱 계층 제공 방법을 숨길 수 있는 개체입니다.

는 이 문는이입다니것입니다.Database개체가 큽니다.데이터베이스에 액세스하는 방법을 나타내므로, 덮개 아래에서 모든 작업을 수행할 수 있습니다.네트워킹, 캐슁 및 배치는 시스템에 따라 처리하기가 매우 어려우므로 이를 숨기는 것이 매우 유용합니다.그러나 많은 사람들이 지적하겠지만, 데이터베이스는 엄청나게 복잡하며 원시 DB 호출에서 멀어질수록 성능을 조정하고 작동 방식을 이해하는 것이 더 어려워집니다.

이것이 OOP의 근본적인 트레이드오프입니다.올바른 추상화를 선택하면 코딩이 더 쉬워지고(문자열, 배열, 사전), 너무 큰 추상화를 선택하면(데이터베이스, Email Manager, 네트워킹 관리자), 너무 복잡해져서 작동 방식이나 기대 사항을 제대로 이해하지 못할 수 있습니다.목표는 복잡성을 숨기는 것이지만, 약간의 복잡성이 필요합니다.경험의 좋은 규칙은 피하기 시작하는 것입니다.Manager객체, 대신 다음과 같은 클래스를 만듭니다.structs그들이 하는 일은 데이터를 보유하는 것뿐이며, 당신의 삶을 더 쉽게 만들기 위해 데이터를 생성/수정하는 몇 가지 도우미 방법을 사용합니다.예를 들어, 의 경우.EmailManager라는 함수로 시작합니다.sendEmail그것은 필요합니다.Email물건.이것은 간단한 시작점이며 코드는 매우 이해하기 쉽습니다.

예를 들어, 찾고 있는 데이터를 계산하기 위해 어떤 데이터가 함께 있어야 하는지 생각해 보십시오.예를 들어, 만약 당신이 동물이 얼마나 멀리 걷고 있는지 알고 싶다면, 당신은 할 수 있습니다.AnimalStep그리고.AnimalTrip(AnimalSteps 모음)이제 각 트립이 모든 단계 데이터를 가지고 있으므로, 아마도 그것에 대한 것을 알아낼 수 있을 것입니다.AnimalTrip.calculateDistance()말이 되는군요.

언급URL : https://stackoverflow.com/questions/4203163/how-do-i-design-a-class-in-python

반응형