ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL.44 과제_클래스 만들기(복기)
    TIL 2020. 11. 22. 17:59
    728x90

    먼저 문제

    Assignment

    Class 를 직접 구현해 보겠습니다.

    Database 라는 이름의 class를 구현해 주세요.

    Database 클래스 내부에 다음의 속성(attribute)들을 선언해주세요.

    • name : database의 이름
    • size : 저장할 수 있는 데이터의 max 사이즈. Size를 넘어서는 데이터를 저장할 수 없다.

    Database 클래스 내부에 다음의 메소드들을 구현해주세요.

    • insert
    • select
    • update
    • delete

    각 메소드들에 대한 설명은 아래와 같습니다.

    Insert

    insert 메소드는 self 외에 2개의 parameter를 받습니다.

    field와 value 입니다.

    Field 는 저장하고자 하는 데이터의 필드명 이고 value는 값입니다.

    Field 와 value는 내부적으로 dictionary에 저장되어야 합니다.

    insert 메소드는 다음 처럼 호출 할 수 있습니다.

    # 객체 이름이 db 라는 가정하에 db.insert("name", "정우성")

    insert 메소드는 특별한 리턴값은 없습니다.

    만일 내부 dictionary의 총 사이즈가 database 클래스의 size 속성보다 크면 더이상 새로운 값들을 저장하지 말아야 합니다.

    Select

    select 메소드는 self 외에 1개의 parameter를 받습니다.

    field 입니다.

    Field 는 읽고자 하는 데이터의 필드명 입니다.

    내부적으로 데이터를 저장하고 있는 dictionary에서 해당 field에 해당하는 키와 연결되어 있는 값을 리턴해주어야 합니다.

    예를 들어, 이미 name이라는 필드명으로 "정우성" 이라는 값을 저장했다고 한다면:

    # 객체 이름이 db 라는 가정하에 db.select("name") > "정우성"

    이 되어야 합니다.

    만일 해당 필드값으로 저정되어 있는 값이 없다면 None 을 리턴해주세요.

    Update

    Self 외에 2개의 parameter를 받습니다.

    field와 value 입니다.

    이름 그대로 이미 저장되어 있는 값을 수정하는 메소드 입니다.

    # 객체 이름이 db 라는 가정하에 db.update("name", "아이유")

    만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.

    그리고 특별한 리턴 값은 없습니다.

    Delete

    delete 메소드는 self 외에 1개의 parameter를 받습니다.

    field 입니다.

    Field 는 지우고자 하는 데이터의 필드명 입니다.

    # 객체 이름이 db 라는 가정하에 db.delete("name")

    만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.

    그리고 특별한 리턴 값은 없습니다.


    나의 첫번째 답(에러)

    class Database:
        def __init__(self, name, size):
            self.name = name
            self.size = size
            self.data = {} # insert 메서드에서 dict 형태로 계속 값을 넣어줘야할 속성이 필요
    
        def insert (self, field, value):
            if len(self.data) >= self.size: # 실제 프로그램 구동이라하면 구체적인 size가 지정되지 않을까 싶다.
                return
            else:
                self.data.update(field = value)
                # dict 값을 수정하는 메서드로 "field"에 해당하는 키가 없으면 맨 마지막 인덱스에 
                # field : value 값이 추가된다. // 여기서는 해당 부분 에러가 발생함
    
        def select (self, field):
            if "field" not in self.data.keys(): # fiedl ""문자열 표시로 인한 에러 발생
                return "None" # 논 출력이 아닌 아무것도 리턴하지 않는것.
            else:
                return self.data[field]
    
        def update (self, field, value):
            if self.data["field"] not in self.data.keys():
                pass
            else:
                self.data.update({field : value})
                # 해당 upadte는 에러가 발생하지 않음
                # update ({키 : 값}) 방법은 키 값이 문자열이 아닌 숫자열일때 적용하는 것으로 알고 있음
    
        def delete (self, field):
            if "field" not in self.data.keys():
                pass
            else:
                del self.data["field"]
                # field "" fiedl ""문자열 표시로 인한 에러 발생
                
                
    # 전체적으로 클래스 , 메서드 정의시 "" 문자열을 표기하는 방법에서 오류가 많이 발생함
    # 전반적 test.py를 보면 모든 키에 해당하는 인수는 문자열로 확인되어 ""을 이용하였으나
    # 결과적으로 이러한 방법이 에러를 야기하게됨
    

    나의 두번째 답 (통과)

    class Database:
      
      def __init__(self, name, size):
        self.name = name
        self.size = size
        self.data = {}
        
      def insert(self, field, value):
        if len(self.data) >= self.size:
          pass
        else:
          self.data.update({field : value})
        
      def select(self, field):
        if field not in self.data.keys():
          return None
        else:
          return self.data[field]
    
      def update(self, field, value):
        if field not in self.data.keys():
          pass
        else:
          self.data.update({field : value})
        
      def delete(self, field):
        if field not in self.data.keys():
          pass
        else:
          del self.data[field]

    나의 두번째 답 (정리)

    사실 해당 메서드들은 복잡한 기능을 구현하는 방법이 없다.

    코드 작성 시 습관적으로 if, else 를 가독성을 위해 사용하였으나,

    이제는 코드 작성시 굳이 else를 작성하지 않아도 되는 상황을 미리 파악하여 좀 더 가독성을 좋게 만들 수 있겠다.

    조건문을 2번 생각해본다면 코드를 더 효과적으로 작성할 수 있을것같다. (물론 다 작성하여 문제가 없을때에 적용 가능할것 같다)

     

    먼저 insert 메서드 변경해보자

      def insert(self, field, value): 
        if len(self.data) >= self.size:
          pass
        else:
          self.data.update({field : value})

    만일 내부 dictionary의 총 사이즈가 database 클래스의 size 속성보다 크면 더이상 새로운 값들을 저장하지 말아야 합니다.

    라는 조건을 dict 사이즈가 size 속성보다 작을때에만 추가하도록 변경해주면 아래와 같다.

      def insert(self, field, value): 
        if len(self.data) < self.size: #
          self.data.update({field : value})
          
    
    # date 길이가 size보다 더 커졌을때 -> data 길이가 작을때만으로

    이제 select 메서드

      def select(self, field):
        if field not in self.data.keys():
          return None
        else:
          return self.data[field]

    not in을 사용하였으나 그냥 in을 사용하는게 훨씬 가독성이 좋다.

    긴줄 아래에는 긴줄이 바로 오는게 좋은 것 같다.

      def select(self, field):
        if field in self.data.keys():
        	return self.data[field]
        return None

    다음은 update

      def update(self, field, value):
        if field not in self.data.keys():
          pass
        else:
          self.data.update({field : value})

    not in -> in으로 바꾸고 field 값이 data dict의 키값에 있다면 해당 키의 값을 변경해준다.

      def update(self, field, value):
        if field in self.data.keys():
        	self.data.update({field : value})

    마지막으로 delete

     def delete(self, field):
        if field not in self.data.keys():
          pass
        else:
          del self.data[field]

    not in -> in으로 바꾸고 field 값이 data dict의 키값에 해당하는 키: 값 쌍을 삭제한다.

      def delete(self, field):
        if field in self.data.keys():
          del self.data[field]

    최종 3번째 답안

    class Database:
      
      def __init__(self, name, size):
        self.name = name
        self.size = size
        self.data = {}
        
      def insert(self, field, value):
        if len(self.data) < self.size:
          self.data.update({field : value})
        
      def select(self, field):
        if field in self.data.keys():
          return self.data[field]
        return None
    
      def update(self, field, value):
        if field in self.data.keys():
          self.data.update({field : value})
        
      def delete(self, field):
        if field in self.data.keys():
          del self.data[field]

    결론 

    아래는 처음 작성하였던 에러 코드와 마지막 작성된 최종 답안을 비교해보자.

    한눈에 비교해도 우측 화면의 가독성이 훨씬 좋은것을 볼 수 있다.

    실제로 문제를 풀며 사용했던 클래스, 메서드는 이렇게 길게 작성할 일이 없었으나

    처음으로 길게 작성해본 결과 어느정도 보완해야할 부분을 찾을 수 있었다.

    이런 형식으로 코드를 작성하는 법을 습관화하지 않으면 나중에 후회할 것이다

    1. 코드가 긴줄 아래에는 긴줄이 위치하게하고 짧은줄은 짧은줄 대로 모아놓는다면 훨씬 가독성이 좋다.

    2. 복잡한 로직이 아닌이상 else문을 매번 넣을 필요는 없다.

    3. 클래스 작성시 주어지는 인수가 문자열이든 숫자열이든 메서드 내에서는 하나의 인수로만 받는다는것을 기억하자.

    ("field" => field)

    728x90
Designed by Tistory.