일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 러스트 기초
- chainlink 설명
- nest.js설명
- ethers v6
- ethers websocket
- ethers
- ambiguous function description
- 스마트 컨트렉트 함수이름 중복
- nestjs 튜토리얼
- 깃허브명령어
- 러스트 기초 학습
- Vue.js
- ethers typescript
- 프록시배포구조
- 스마트컨트렉트테스트
- 컨트렉트 동일한 함수이름 호출
- vue기초
- Vue
- git rebase
- 스마트컨트렉트프록시
- 스마트컨트렉트 함수이름 중복 호출
- rust 기초
- 러스트기초
- 컨트렉트 배포 자동화
- multicall
- ethers type
- 체인의정석
- 머신러닝기초
- 스마트컨트렉트 예약어 함수이름 중복
- SBT표준
- Today
- Total
체인의정석
소프트웨어 구현 방법론 - 코드 리팩토링의 방법들 본문
처음 스마트 컨트렉트 ERC20 표준 코드를 보았을 때 함수암에 함수를 호출하는 부분이 너무 많아 그게 왜 그런지 의아했던 때가 있었다. 그러나 그 코드를 보았을때 주석 없이도 이해하기 편했던 경험 또한 있다. 코드를 작동하도록 짜는것은 쉽지만 사람이 이해하기 쉽도록 짜는것이 가장 중요하다고 한다. 이를 위해서 필요한것이 코드 리팩토링이다. 코드리팩토링이 필요한 부분과 그 기법들에 대해 정리해 보도록 하겠다.
1. 리팩토링과 리엔지니어링의 차이
리팩토링의 경우 동작이 변화는 없고 구조의 변화만 있다. 청소와 같은 느낌이다.
리엔지니어링의 경우 새로운 특징이 반영되고 결함이 수정되며 SW aging으로 노후화될 경우 실행하여 새로운 기능도 추가된다. 이는 리모델링과 같은 느낌으로 볼 수 있다.
리엔지니어링 안에는 리버스 엔지니어링 개념도 있는데 이는
개념 -> 설계 -> 구현 -> 실행파일의 순서를 반대로 뒤집어서 실행파일을 보고 설계도와 개념을 뽑아내는 순서로 분석하는 것이다.
이번 글에서 설명할 것은 새로운 기능이 포함되는 경우가 아닌 일반적인 기준에서의 리팩토링 기법들이다.
2. 주석이 많은 경우 리펙토링이 필요하다.
- 주석이 메소드가 하는일을 설명할 시 이는 method rename을 통해 리팩토링을 한다. 메소드 이름만 보고도 무슨 역할인지 알 수 있게 쓰는 것이다.
- 블록이 하는일을 주석이 설명할 시 메세드로 만드는 Extract Method를 사용한다. 하는일을 메소드로 따로 빼서 주석이 필요 없도록 쓰는 것이다.
- 마지막으로 상태에 대한 가정을 assertion을 사용하여 요구사항을 코드로 구현하는 것이 있다. 이를 designed by contract로 부른다.
3. 긴 메소드
- 메소드가 긴 경우 리팩토링이 필요하다.
4. 비대한 클래스의 경우 리팩토링이 필요하다.
-Extract Class
클래스 추출
-Extract Sub class
새로운 하위 클래스 형태
-Extract Interface
사용하는 기능 일부만 따로 묶을 때 인터페이스로 뽑아서 묶기
5. 긴 매개변수
Replace Parameter with method : 파라미터 말고 함수로 받아올 수 있는 경우 파라미터 부분에 함수를 넣기
Preserve whole object : 파라미터로 객체를 통째로 받아와서 사용하기
Introduce Patameter Object : 몰려다니는 것은 객체로 묶어서 사용하기
6. 변수 이름
간결하 명확하게 쓰기
7. 중복
- 기호상수(magic Number 사용)
상수가 있을 경우 이를 의미에 따라 변수로 선언한 후 위에서 그 상수를 변수와 같이 선언하여 중복되는 상수에 대한 가독성을 높인다.
Replace Magic Number with Symbolic Constant
(의미를 살린 이름의 상수 작성 후 리터럴 숫자를 그 상수로 교체)
- 하위클래스에 같은 필드가 들어있을때 기능이 같은 메서드가 여러 클래스에 있을때 중복된 부분을 상위 클래스로 뽑아버리기
- form template method
동일 순서와 비슷한 단계를 통해 동일한 시그니처를 가진 메서드로 단계를 만든후 오버라이드 하여 사용하기
8. 불필요한 복잡성 제거하기
-다른 인터페이스를 갖는 대체 클래스
Collapse Hirearchy : 슈퍼 클래스와 서브클래스가 별로 다르지 않다면 그것들을 하나로 합치기
하위클래스가 쓸모없어지면 하나로 합친다.
- Inline class
클래스가 별다른 일을 하지 않는다면 해당클래스의 기능을 다른 클래스로 옮기고 삭제한다.
해당클래스의 기능을 다른 클래스로 옮기고 삭제한다.
쓸데 없이 함수가 함수를 부르는 부분이 이에 해당된다.
9. 조건로직
Null을 체크하는 부분을 공통으로 빼서 한번에 처리한다.
10. 복잡한 boolean 표현식
드모르간의 법칙으로 바꿈 또는 변수로 조건 표현
드모르간의 법칙으로 바꾸는 경우 가독성이 더 좋아질 수 있으며
복잡한 참거짓 조건의 경우 변수화하여 표현하면 더 간략하다.
11. 데이터
Replace Type Code with subclass - 서브클래스를 생성하여 데이터 타입들을 관리하기
Replace Type Code with state/strategy - 서브클래스를 만들 수 없을 경우 상태별로 클래스 정의 하기
Replace Array With Object - 배열안에 의미 없이 여러개가 담겨 있다면 이를 객체화하여 관리하기
Encapsulate Collection - 캡슐화 시키기, 하나의 객체로 캡슐화를 시킨 후 getter와 setter기능을 만들어 관리시키기
'개발' 카테고리의 다른 글
서버의 구분과 프론트 엔드 프레임워크 WAS, DB, 웹서버의 구분과 차이, 프론트엔드 프레임워크가 나온 이유 (0) | 2020.06.19 |
---|---|
소프트웨어 구현 방법론 - Software Inspection & peer review (0) | 2020.06.14 |
소프트웨어 구현 방법론 - 단위 테스트 (0) | 2020.06.14 |
유튜브 layzy load 시키기 동영상 lazyload (0) | 2020.06.11 |
PostqreSQL사용하기 (0) | 2020.06.02 |