🥕
TIL
  • [TIL] Studying tech / computer science knowledge
  • KeyMap
  • 알고리즘
    • 복잡도 계산 ( Computational Complexity )
    • DisjointSet-unionFind
    • Bellman-ford Algorithm
    • Dijkstra's Algorithm
    • DP ( Dynamic Programming , 동적 계획법 )
    • 플로이드-워셜 알고리즘 (Floyd-Warshall algorithm)
    • Kruskal's Algorithm
    • 최장 증가 수열 (Longes Increasing Subsequence)
    • Prim's Algorithm
    • 정렬
    • 시간복잡도 와 공간복잡도 ( Time Complexity & Space Complexity )
    • Topological Sort (위상 정렬)
  • 책 읽고난 후 요약
    • 프로그래밍 대회에서 배우는 알고리즘 문제해결 전략
    • cleancode
    • 도메인 주도 설계로 시작하는 마이크로서비스 개발
    • 오브젝트
  • CDC
    • debzium
    • kafka
  • 개발 상식
    • asciidoctor
    • 컴파일러
    • ELK 스택
    • 엔디안
    • git
    • Gitmoji
    • 테스트 종류
    • 라이브러리와 프레임워크
    • 정규 표현식
    • REST API
    • 동기와 비동기 / Blocking과 NonBlocking
    • Transaction Script와 Domain Model
    • 디자인 패턴
      • 행동 패턴
      • 객체 생성 패턴
        • 추상 팩토리 패턴
        • 빌더 패턴
        • 팩토리 메서드 패턴
        • [생성 패턴] 프로토 타입 (Prototype Parttern)
        • 싱글톤
      • 구조 패턴
        • 어댑터 패턴
        • 브릿지 패턴
        • 컴포짓(Composite) 패턴
        • 데코레이터
        • 프록시
    • refactoring
      • 중복 코드
      • 전역 데이터
      • 긴 함수
      • 긴 매개변수 목록
      • 가변 데이터
      • 이해하기 힘든 이름
  • 자료구조
    • AVL Tree
    • Splay Tree
    • aaTree
    • array-list
    • 자료구조 시간/공간 복잡도
    • 그래프
    • 힙
    • Red Black Tree
    • stack-queue
    • 트리 ( Tree )
  • DevOps
    • MSA
    • Kubernetes
      • AccessingAPI
      • controller
      • dashboard
      • kubernetes
      • object
      • pod
      • service
      • volume
  • Java
    • 어노테이션
    • 제어문
    • 데이터 타입
    • Enum
    • jvm
    • 연산자
    • thread
    • Java8
      • CompletableFuture
      • Date/Time
      • 어노테이션과 메타스페이스
      • 인터페이스
      • 람다식
      • Optional
      • 스트림
  • JavaScript
    • moduleProject
    • webpack-babel
    • 코어 자바스크립트
      • array
      • 함수 바인딩
      • 데코레이터와 포워딩
      • Class
      • 비교 연산자
      • Date 내장 객체
      • destructuring-assignment
      • function
      • 함수의 prototype 프로퍼티
      • 가비지 컬렉션 ( Garbage Collection )
      • JSON (JavaScript Object Notation)
      • map-set
      • 내장 프로토타입
      • new연산자와 생성자 함수
      • 객체
      • Object.keys, values, entries
      • 옵셔널 체이닝 '?.'
      • 프로퍼티 플래그
      • 프로퍼티 종류
      • 프로토 타입
      • 호출 스케줄링 ( scheduling a call )
      • scope
      • this
      • type-conversions
      • type
      • 함수의 자료형
      • var_let_const
  • Linux
    • 기본 명령어
    • 파일 종류
    • 리눅스
  • 네트워크
    • 응용 계층 ( Application Layer )
    • 오류 검출과 오류 정정
    • Http
    • Http Header
    • 컴퓨터 네트워크란
    • 네트워크 계층
    • 네트워크 제어 영역
    • 전송 계층 ( Transport Layer )
  • PHP
    • Facade
    • composer
    • scopeResolutionOperator
    • Laravel
      • SocialProvider
      • architecture
      • blade
      • controller
      • db
      • dbArchitecture
      • debug
      • eloquent
      • email
      • event
      • exceptionHandling
      • middleware
      • model
      • modelFactory
      • pagingLoading
      • queryBuilder
      • route
      • scout
      • seeding
      • tntsearch
      • validate
      • view
  • React
    • Next.js
    • React 란?
  • Spring
    • Controller
    • 요청이 들어왔을때 스프링이 처리하는 방법 ( 내부구조 )
    • ConfigurationProperties
    • Entity / DTO / VO
    • Maven
    • Repository와 DAO
    • 스프링 빈
    • Spring Framework
    • MVC 패턴
    • 도메인 입력값 검증
    • Spring Cloud
      • Spring Cloud
      • Eureka
    • Spring Data
      • JPA
      • JPA 어노테이션
      • 엔티티 비교
      • 복합 키와 식별 관계 매핑
      • JPA 예외처리
      • 객체지향 쿼리
      • EntityManagerFactory와 EntityManager
      • JPA 최적화
      • 프록시와 연관관계 맵핑
      • 연관관계
      • 상속관계 맵핑
      • 트랜잭션 범위와 영속성 컨텍스트
      • 데이터 타입
      • MySQL 연결
      • Pageable
    • Spring Project들과 library
      • Custom Serialize
      • Elasticsearch Index API
      • Spring HATEOAS
      • lombok (롬복)
      • Model Mapper
      • Object Mapper
      • Representation Model
      • Spring REST Docs
      • Spring Boot
    • Spring Security
      • Spring Security
      • Authentication
      • Authentication Filter
      • Authorization Filter
      • Filter Chain
      • SecurityContext
      • Spring OAuth2.0
    • Spring Test
      • AssertJ
      • Junit5
      • JunitParams
      • Mock Object
  • DataBase
    • ALIAS
    • CONCAT
    • CTE
    • Group By
    • HAVING
    • IFNULL
    • 인덱스
    • JOIN
    • ORDER BY
    • ROLLUP
    • SELECT
    • SELECT DISTINCT
    • SQL
    • WHERE
  • Web 상식
    • OAuth
    • WAS
    • HTTP통신 기반 인증
    • 브라우저
    • CSR 과 SSR
    • HTTPS
    • Web
Powered by GitBook
On this page
  • 변수 쪼개기
  • 질의 함수와 변경 함수 분리하기
  • Setter 제거하기
  • 파생 변수를 질의 함수로 바꾸기
  • 여러 함수를 변환 함수를 묶기
  1. 개발 상식
  2. refactoring

가변 데이터

최근 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달하는 방식으로 Mutable한 속성을 보장한다. 하지만 그 외의 언어는 데이터 변경을 허용하고 있어 변경되는 데이터를 사용할 때는 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다.

변수 쪼개기

어떤 변수가 여러번 재할당 되어도 되는 경우

  • 반복문에서 순회하는데 사용하는 변수/인덱스

  • sum과 같은 값을 축적시키는데 사용하는 변수

위와 같은 경우를 제외한 경우에 재할당 되는 변수가 있다면 해당 변수는 여러 용도로 사용되는 것이며 변수를 분리해야 더 이해하기 좋은 코드를 만들 수 있다.

  • 변수 하나당 하나의 책임을 지도록 만들기

  • 상수를 활용하기

//AsIs
public void updateGeometry(double height, double width) {
    double temp = 2 * (height + width);
    System.out.println("Perimeter: " + temp);
    this.perimeter = temp;

    temp = height * width;              //temp라는 변수가 중복되서 사용되고 있는데 permiter인지 area인지 후에 식별이 어려워질 수 있다.
    System.out.println("Area: " + temp);
    this.area = temp;
}

//Tobe
public void updateGeometry(double height, double width) {
    double perimeter = 2 * (height + width);
    System.out.println("Perimeter: " + perimeter);
    this.perimeter = perimeter;

    double area = height * width;
    System.out.println("Area: " + area);
    this.area = area;
}

질의 함수와 변경 함수 분리하기

명령-조회 분리 규칙

  • 어떤 값을 리턴하는 함수는 사이드 이팩트가 없어야 한다. (내부 값을 변경하지 않아야 하고, 다른 행동을 수행하면 안된다.)

Setter 제거하기

Setter를 제공하는 것은 내부 상태가 변경될 수 있다는 것을 의미한다. 객체 생성시 처음 설정된 값이 변경될 필요가 없다면 해당 값을 설정할 수 있는 생성자를 만들고 Setter를 제거해서 변경될 수 있는 가능성을 제거하기.

//AsIs
public class Person {
    private int id;
    private String name;

    Person(int id, String name){this.id = id, this.name = name;}

    public String getName(){return this.name;}
    public int getId(){return this.id;}
    public void setName(String name){this.name = name;}
    public void setId(int id){this.id = id;}
}

//ToBe
//만일, id는 변경되지 않는 값이라고 하면 setter는 없애기
public class Person {
    private int id;
    private String name;

    Person(int id, String name){this.id = id, this.name = name;}

    public String getName(){return this.name;}
    public int getId(){return this.id;}
    public void changeName(String name){this.name = name;}  //setter도 단순히 set~ 으로 명명하는 것보다는 보다 이해하기 쉬운 명시적인 이름으로 작명해주는 것이 바랍직하다.
}

파생 변수를 질의 함수로 바꾸기

계산해서 알아낼 수 있는 변수는 제거

  • 계산 자체가 데이터의 의미를 잘 표현하는 경우가 존재

  • 해당 변수가 어디선가 잘못된 값으로 수정될 수 있는 가능성을 제거할 수 있다.

계산에 필요한 데이터가 변하지 않는 값이라면, 계산의 결과에 해당하는 데이터 역시 불변 데이터이기 때문에 변수를 유지할 수 는 있다.

//AsIs
public class Discount {
    private double discountedTotal;
    private double discount;
    private final double baseTotal;

    public Discount(double baseTotal) {
        this.baseTotal = baseTotal;
    }

    public double getDiscountedTotal() {
        return this.discountedTotal;
    }

    public void setDiscount(double number) {
        this.discount = number;
        this.discountedTotal = this.baseTotal = this.discount;  //discountedTotal은 baseTotal과 discount의 영향을 받는 값으로써 변수로 할당한다면 discount가 바뀔때마다 상태를 변경해주어야 한다.
    }
}

//ToBe
public class Discount {
    private double discount;
    private final double baseTotal;

    public Discount(double baseTotal) {
        this.baseTotal = baseTotal;
    }

    public double getDiscountedTotal() {
        return this.baseTotal = this.discount; 
    }

    public void setDiscount(double number) {
        this.discount = number;
    }
}

여러 함수를 변환 함수를 묶기

관련있는 파생 변수를 만들어내는 함수가 여러곳에서 만들어지고 있다면 변환 함수를 통해 한 곳으로 모으기

소스 데이터가 변결될 수 있는 경우에는 여러 함수를 클래스로 묶기를 사용

Previous긴 매개변수 목록Next이해하기 힘든 이름

Last updated 3 years ago