[Clean Code] 5-1 형식

2021. 9. 6. 00:02·IT/Clean Code
반응형

형식

소스를 보았을 때 코드가 깔끔하고 일관적이며 꼼꼼하며 질서정연하다고 생각되면 좋겠다.
술 취한 사람이 짜놓은 듯한 코드로 보인다면 코드를 보는 사람은 다른 부분도 그렇다고 생각 할 것이다.

개인적으로 스파게티처럼 작성된 소스는 유지보수할때 나도 스파게티를 만든는 경향이 있는데 비교적 잘 짜여졌다고 생각되는 부분을 고칠때는 나도 조심하여 일관성 있게 코드를 작성 할려고 하는 것 같다.

프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다.
팀마다 형식을 맞추고 규칙을 정하며 규칙을 따라야 한다.
필요하다면 형식을 적용하는 도구를 활용해도 된다.

jetbranin 제품을 사용한다면 코드 양식을 1명이 수정한 다음
config 파일 공유해도 괜찮지 않을까? 싶다.

#

형식을 맞추는 목적

누군가 "돌아가기만 하면 된다" 이런 말을 한다면 옥수수 수확해도 인정한다.
구현한 코드는 미래의 유지보수와 가독성에 거대한 영향을 미칠 것이다.
맨 처음 구현한 코드의 유지보수 용이성과 확장성이 엉망으로 짜있었고
여기에 더불어 리팩토링을 하지 않고 계속 유지보수를 추가 했다면 끔찍할 것이다.

리뉴얼 하지 않은 옛날 프로젝트가 이런식으로 짜여 있다...
힘들다...

#

적절한 라인수를 유지하라

Junit, FitNesse 프로젝트는 500줄을 넘어가는 파일이 없고
대다수가 200줄 미만이다. 라인수를 적게 가져간다고 프로젝트 개발을
못하는 것이 아니다.
반드시 지킬 엄격한 규칙은 아니지만 바람직한 규칙이다.
일반적으로 라인수가 많은 것보다는 적은 게 이해하기 쉬우니까 말이다.

#

밀집도

서로 밀접한 코드행은 세로로 가까이 놓게 하고
개념적으로 유사한 코드는 가까이 배치한다.
또한 종속 함수도 서로 가까이 배친한다.
일반적으로 세로 순서는 고차원 -> 저차원 순으로 하는게 이상적이다.
이를 통해 소스를 볼때 위부터 읽고 이는 첫번째 함수만 읽어도 무엇을 하는 기능인지 파악하기 쉬워진다.

변경 전

type Something struct {
    some  string
    thing string
}

func NewSomething(some string, thing string) *Something {
    s := Something{
        some:  some,
        thing: thing,
    }
    return &s
}

func ThingThingThing(s *Something) {
    for i := 0; i < 3; i++ {
        fmt.Println(s.Thing())
    }
}

func (s *Something) DoThing() {
    fmt.Println("Do " + s.thing)
}

func (s *Something) Some() string {
    return s.some
}

func (s *Something) Thing() string {
    return s.thing
}

func (s *Something) DoAnyThing() {
    fmt.Println("Do Any " + s.thing)
}

변경 후
get 은 위로 thing 메소드는 서로 가깝게 배치 하였고 종속함수 또한 그렇게 하였다.

type Something struct {
    some  string
    thing string
}

func NewSomething(some string, thing string) *Something {
    s := Something{
        some:  some,
        thing: thing,
    }
    return &s
}

func (s *Something) Some() string {
    return s.some
}

func (s *Something) Thing() string {
    return s.thing
}

func (s *Something) DoThing() {
    fmt.Println("Do " + s.thing)
}

func (s *Something) DoAnyThing() {
    ThingThingThing(s)
}

func ThingThingThing(s *Something) {
    for i := 0; i < 3; i++ {
        fmt.Println(s.Thing())
    }
}
728x90
반응형
저작자표시 비영리 (새창열림)
'IT/Clean Code' 카테고리의 다른 글
  • [Clean Code] 6-2 객체지향 절차지향 2
  • [Clean Code] 6-1 객체지향 절차지향
  • [Clean Code] 4-1 주석
  • [Clean Code] 3-2 Functions
상쾌한기분
상쾌한기분
  • 상쾌한기분
    상쾌한기분
    상쾌한기분
  • 전체
    오늘
    어제
    • 분류 전체보기 (250)
      • Python (44)
        • Python (26)
        • Django (6)
        • Flask (4)
        • Open Source (6)
      • Kotlin & Java (5)
        • Spring (2)
        • 프로젝트 (1)
      • Go (11)
      • Database (24)
        • MySQL (21)
        • Redis (3)
      • Infrastructure (2)
        • CDC (4)
        • Kafka (5)
        • Prometheus (2)
        • Fluentd (11)
        • Docker (1)
        • Airflow (2)
        • VPN (2)
      • IT (25)
        • AI (9)
        • Langchain (8)
        • Web (18)
        • Git (8)
        • 리팩토링 (9)
        • Micro Service Architecture (8)
        • Clean Code (16)
        • Design Pattern (0)
        • 수학 (1)
        • 알고리즘 (14)
      • OS (14)
        • Centos (10)
        • Ubuntu (3)
        • Mac (1)
      • Search Engine (2)
        • ElasticSearch (1)
        • Lucene Solr (1)
      • PHP (2)
        • Laravel (1)
        • Codeigniter (1)
  • 블로그 메뉴

    • Github 방문
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    go
    오블완
    prompt
    docker
    python
    CDC
    LLM
    http
    fluentd
    ollama
    백준
    performance
    Redis
    Kafka
    Golang
    MYSQL
    파이썬
    Langchain
    git
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상쾌한기분
[Clean Code] 5-1 형식
상단으로

티스토리툴바