간단 물류시스템 구축하기!

차보경·2022년 7월 11일
1

TIL

목록 보기
5/37
post-thumbnail
post-custom-banner

요즘 Good Code Bad Code 책을 풀잎러닝(flip learning)으로 배우면서 협업을 위해 코드를 짤 땐 어떤점을 주의해야하는지 배우고있다!

  • 책 추천...ddd

기본이 C언어로 되어있어서 쉽게 이해하긴 어렵지만, 지난주까지 앞에 이론 부분을 끝내고 오늘은 실습을 진행했다!

아래는 퍼실님이 제시한 상황!
혹시 보시는 분이 계시다면 같이 해보셔도 재밌습니당:)!

🕺시스템 요구사항 명세서

💡 상황
발주사는 물류 창고에서 화물을 조회, 추가, 삭제, 시스템 On/OFF 기능이 있는 시스템 제작을 의뢰했고 해당 System을 구현하여 납품해야 한다.


1. 중앙 시스템

물류 조회(Read), 추가(Create), 삭제(Delete), 시스템 종료 기능에 접근할 수 있는 중앙 시스템을 CLI으로 구현할 것.

필수 기능

  • 중앙 시스템은 무한 반복문으로 반복하여 주요 기능을 수행하도록 구성되어야 한다.
  • 중앙 시스템은 4가지 주요 기능에 접근할 수 있어야 한다.
  • 중앙 시스템은 유저가 입력할 수 있는 커맨드 인터페이스를 제공해야 한다.
  • 유저가 입력한 기능은 int 정수형으로 처리해야한다.

2. 물류 조회 시스템

현 시스템에 등록된 모든 화물(물건) 데이터를 출력하는 시스템을 CLI으로 구현할 것.

필수 기능

  • 물류 조회 시스템은 시스템에 등록된 모든 화물(물건)을 출력해야한다.
  • 물류 조회 시스템은 화물(물건) 데이터를 index 0번 부터 오름차순으로 정렬하여 출력한다.
  • 화물(물건) 출력 작업 완료 후, 중앙 시스템으로 복귀해야한다.

3. 물류 추가 시스템

현 시스템에 화물(물건) 데이터를 추가하는 기능을 CLI으로 구현할 것.

필수 기능

  • 물류 추가 기능은 화물(물건)의 이름을 String 값으로 처리해야한다.
  • 물류 추가 기능은 화물(물건) 추가 이전에, 추가하는 물류 이름에 대해 유효성을 검증하는 질문 메세지를 사용자에게 질의해야한다.
  • 사용자가 동의(Y)를 했을 때만, 현 시스템에 화물을 추가할 수있다.
  • 사용자가 미동의(N) 또는 잘못된 값을 대입했을 때, 메인 시스템으로 복귀한다.
  • 사용자가 동의/미동의 시 (Y, y, N ,n) 대소문자를 구분하지 않았을 때 예외사항을 처리해야한다.
  • 화물(물건) 추가 작업 완료 시, 사용자에게 해당 화물의 추가 알림 메시지를 출력 후 중앙 시스템으로 복귀해야한다.

4. 물류 삭제 시스템

현 시스템에 화물(물건) 데이터를 삭제하는 기능을 CLI으로 구현할 것.

필수 기능

  • 물류 삭제 기능은 화물(물건)의 index 값으로 처리해야한다. (int 자료형)
  • 물류 삭제 기능은 화물(물건) 추가 이전에, 추가하는 물류 index에 대해 유효성을 검증하는 질문 메세지를 사용자에게 질의해야한다.
  • 사용자가 동의(Y)를 했을 때만, 현 시스템에 등록된 화물을 삭제할 수있다.
  • 사용자가 미동의(N) 또는 잘못된 값을 대입했을 때, 메인 시스템으로 복귀한다.
  • 사용자가 동의/미동의 시 (Y, y, N ,n) 대소문자를 구분하지 않았을 때 예외사항을 처리해야한다.
  • 화물(물건) 삭제 작업 완료 시, 사용자에게 화물 삭제 알림 메시지를 출력 후 중앙 시스템으로 복귀해야한다.

5. 물류 시스템 종료

현 중앙 시스템의 동작을 종료하는 기능을 CLI으로 구현할 것.

필수 기능

  • 시스템 종료

구현 결과

1. 물류 조회

  • 커맨드 인터페이스를 따로 제공하면서 무한루프로 돌아감 확인

2. 물류 추가(상차)

  • 물류시스템에 정상적으로 등록됨
  • Y가 아닌 다른 입력시 메인으로 돌아감

3. 물류 출고(하차)

  • 인덱스 번호를 통해 물건이 삭제되며 이후 메인으로 돌아감
  • Y가 아닌 다른 입력시 메인으로 돌아감

4. 시스템종료

  • 종료~

실습 후 배운점

  1. 까먹지 말자
  • class 내부에 함수사용시 (self) 넣고 class 변수 적용할 때 self.변수명으로 받기
  • main함수에서 while(1):로 무한반복 걸어놓으면 내부 함수에서 return시 while문 다시 시작
  • if __name__ == '__main__': \ main() 메인으로 돌아가게 하는 코드
  • main 함수는 main()으로 받을 수 없음 => 그냥 return or continue 하면 돌아감
  1. 코드를 쓰기전 추상화를 먼저하고 시작함
  • 정말 별거 없긴하지만, 예전엔 급한마음에 머리로 생각하고 바로 코드를 쓰기 시작했다. 하지만 책을 통해 먼저 어떤 식으로 구성을 해야할지 짜놓고 시작하니 복잡하게 생각하지 않고 딱 깔끔하게 진행이 되었다.
  1. 읽기 쉽게 작성하려고 노력함
  • 작성한 나는 코드를 쉽게 이해할 수 있지만, 다른 사람이 봤을 때는 어렵다...(나도 다른사람 코드보면서 느낌..) 그래도 최대한 코드로 말할 수 있도록 노력하기 시작했다.
    • 이 책에서 가장 중요시 한 것은 코드는 내가 작성하지만 이후엔 다른사람이 또 수정(유지보수)한다는 것이었다. 현업에서도 중요한 문제이기에 코드스타일을 바꾸기 위해 가장 유념했던 부분이었다.
    • 그래서 객체명, 함수명, 클래스명 모두 의미를 알 수 있게 작성했다. (작명스타일도 신경씀)
  1. 모듈화!
  • 원래였다면 하나의 함수나 클래스에 우루루루 담았을 내용이었지만, 하나의 함수/클래스에 모두 담지말고, 기능별/역할별로 나눠서 함수화한 다음 하나로 묶음
  • 이후 각 단계에 추가적인 기능이 들어와도 쉽게 적용할 수 있도록 작성하려고 했음!
  1. 뿌듯하다...
  • 1-2달 전만해도 이것보다 쉬운 문제에 멍....했던 나였지만 그래도 1시간이라는 제한된 시간(사실 이것도 길지만..)안에 나름 조건을 다 갖추고 실행가능하게 만들었다는 것이 뿌듯하다!!!

작성 코드

class CargoSystem():
    # 빈 item_list 생성
    item_list = ['물류1', '물류2', '물류3', '물류4', '물류5']


    ########## [1] 물류조회 ############
    def item_search(self):
        for idx, value in enumerate(self.item_list):
            print(f'{idx} : {value}')
        return


    ########## [2] 물류 추가(상차) ############
    def item_add(self):
        new_item = input('추가할 물건의 이름을 입력해주세요 : ')
        print(f'추가하려는 물건이 {new_item} 이/가 맞습니까?')
        add_sure = str(input('Y/N : '))
        add_sure = add_sure.upper()
        #### Y/N 상황 구현 ####
        if add_sure == 'Y':
            self.item_list.append(new_item)
            print(f'{new_item} 이/가 추가되었습니다!')
            return 
        else:
            print("중앙 시스템 메뉴로 돌아갑니다.")
            return


    ########### [3] 물류출고(하차) #############
    def item_del(self):
        for idx, value in enumerate(self.item_list):
            print(f'{idx} : {value}')
        print('\n[물류하차] 출고할 물건의 번호를 입력해주세요 (0부터 시작)')
        del_num = int(input('물건 번호 : '))
        print(f'삭제하려는 물건의 번호가 {del_num}가 맞습니까?')
        del_sure = str(input('Y/N : '))
        del_sure = del_sure.upper()
        # 예외상황 처리
        try:
            if del_sure == 'Y':
                del self.item_list[del_num]
                print('물건이 출고되었습니다!')
                return 
            else:
                print("중앙 시스템 메뉴로 돌아갑니다.")
                return
        except:
            print('해당 숫자의 물건번호가 없습니다.')
            print("중앙 시스템 메뉴로 돌아갑니다.")
            return


    ############# [4] 시스템 종료 ###########
    def shutdown(self):
        print('시스템을 종료합니다.')
        return exit()


def print_main_message():
        # main message & select number input
        print('\n','==' * 20)
        print('물류센터 시스템에 오신 것을 환영합니다:)!')
        print('[1] 물류조회 [2] 물류 추가(상차) [3] 물류출고(하차) [4] 시스템 종료')



def main():

    cargo_manager = CargoSystem()
    # 무한반복
    while(1):

        print_main_message()    

        select_num = int(input('실행 번호 : '))

        #### 해당 number 구현 ######
        if (select_num == 1) :
            cargo_manager.item_search()
        elif (select_num == 2):
            cargo_manager.item_add()
        elif (select_num == 3):
            cargo_manager.item_del()
        elif (select_num == 4):
            cargo_manager.shutdown()


    

if __name__ == '__main__':
    main()
profile
차보의 Data Engineer 도전기♥ (근데 기록을 곁들인)
post-custom-banner

0개의 댓글