Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chap5. 가독성 높은 코드 작성하라 #7

Open
softmoca opened this issue Oct 27, 2024 · 10 comments
Open

chap5. 가독성 높은 코드 작성하라 #7

softmoca opened this issue Oct 27, 2024 · 10 comments
Assignees
Labels

Comments

@softmoca
Copy link
Collaborator

softmoca commented Oct 27, 2024

[Chap5. 가독성 높은 고드 작성하라]를 읽고

  • 관련된 issue
  • 다른 의견
  • 잘못된 정보

등을 알려주세요!

@softmoca softmoca added the week1 label Oct 27, 2024
@hoonyworld
Copy link
Member

복잡한 로직이 필요한 경우, 익명 함수 대신 명명된 함수를 사용하는 것이 좋다.

개선되는 예시를 코드로 보고싶습니다!

@Gilbert9172
Copy link
Collaborator

public class Sample {
    // Field
    private String name;
    private int age;
    
    // Constructor
    public Sample() {
    }

    public Sample(...) {
    }  

    public Sample(...) {
    }  
    
    // Method
    public void methodA() {
        //...
    }

    public void methodB() {
    }

    public void methodC() {
    }
    
}

혹시 여러분들은 클래스에 단락 별로 주석을 작성하시는거에 어떻게 생각하시나요?
저는 클래스 가자마자 얼타는 시간을 줄이기 + 눈이 안좋음 이슈.. 로 인해서 이렇게
작성하긴 해서요!

@Gilbert9172
Copy link
Collaborator

Using for loop

public Members registerMembers(final List<String> names, final String teamName, final String backNumber) {
    List<Member> members = new ArrayList<>();
    for (String name : names) {
        BackNumber number = BackNumber.from(backNumber);
        Team team = Team.from(team);
        Member member = Member.from(number, team);
        members.add(member);
    }
    return Members.of(members);
}

Using Stream API

public Members registerMembers(final List<String> names, final String teamName, final String backNumber) {
    List<Member> members = names.stream()
            .map(name -> {
                BackNumber number = BackNumber.from(backNumber);
                Team team = Team.from(team);
                return Member.from(number, team);
            }).toList();
    return Member.of(cars);
}

저는 개인적으로 복잡한 객체의 생성의 경우 Stream API 보다는 for문이 가독성이 더 좋다고 생각합니다.
물론 주간에 filtering을 사용해야 한다면 Steam API가 괜찮다고 생각도 합니다.

만약 단순히 복잡한 객체의 생성이라면 여러분은 어떤 코드가 더 가독성이 높다고 생각하시나요?
(이번 챕터가 가독성 관련이라 가독성 의견만 주시면 감사하겠습니다!)

@Gilbert9172
Copy link
Collaborator

개발을 하다보면 도메인 지식도 어느정도 알고있어야 한다고 생각합니다.
예를들어 프롭테크 개발자가 부동산 도메인에 대해서 알지 못한다면 요구사항에 맞는 결과물을 내놓기 힘들다고 생각합니다.
그런데 도메인에 맞춰 개발 하게되면 통상적으로 쓰이지 않는 단어가 많이 사용될 것으로 예상됩니다.

여러분들은 어떻게 생각하시나요?

  • 의견1 ) 이 도메인을 첨 접하는 사람을 위해서 그냥 일반적인 네이밍을 사용한다.
  • 의견2 ) 아니다. 해당 도메인에 대한 용어와 일반 용어를 혼용해서 쓰면 추후 코드를 읽음에 있어 문제가 있을 것이다.

@Gilbert9172
Copy link
Collaborator

5.9 프로그래밍 언어의 새로운 기능을 적절하게 사용하라

가장 최신 Java21에서 virtual thread라는 기능이 등장했는데
(지금은 당장은 아니더라도)시간 나실 때, 이게 뭔지 정도는 알아보는 거 추천드립니다!!

@softmoca
Copy link
Collaborator Author

List<UInt16> getValidIds(List<UInt16> ids) {
    return ids
        .filter(id -> id != 0)
        .filter(id -> countSetBits(id & 0x7FFF) % 2 == ((id & 0x8000) >> 15));
}

위 코드에서는 패리티 비트를 확인하는 논리는 익명함수료 표현되어있습니다.

하지만 id -> countSetBits(id & 0x7FFF) % 2 == ((id & 0x8000) >> 15) 를 보고 패리티 비트를 확인한다는 점이 자명하게 들어나지 않아 가독성이 떨어집니다 !

getValidIds를 읽는 사람은 유효한 ID를 얻기 위한 세부 사항만 알고 싶어 할것입니다.

이를 위해 아래 두가지의 개념적 조건만 인식하면 됩니다.

  • 0이 아니다.
  • 패리티 비트가 정확하다.

이를 위해 비트 연산과 같은 하위 수준의 세부 개념 때문에 어려움을 격도록 하지 않기 위해 구현 세부 사항을 아래와 같은 별도의 명명함수로 뺴내어 해결할 수 있습니다.

List<UInt16> getValidIds(List<UInt16> ids) {
    return ids
        .filter(id -> id != 0)
        .filter(isParityBitCorrect);
}

private Boolean isParityBitCorrect(UInt16 id) {
    ...
}

위 코드를 읽으면 0이 아닌 ID를 필터링한 후 패리티 비트가 올바른 ID만 필터링 한다는 것을 즉시 이해할 수 있습니다.

위 예시에서 볼 수 있듯이 익명 함수는 명명 함수 작성 시 항상 사용해야만 하는 문장을 작성하지 않아도 되기 때문에 코드를 줄이는 데는 뛰어나지만, 함수에 더 이상 이름이 없다는 단점이 있습니다.

고로 간단하고 자명한 논리는 익명 함수를 써도 일반적으로 괜찮지만, 복잡한 논리는 명명 함수를 쓰는 것이 사고의 가독성 측면에서 이점이 많습니다.

@softmoca
Copy link
Collaborator Author

public class Sample {
    // Field
    private String name;
    private int age;
    
    // Constructor
    public Sample() {
    }

    public Sample(...) {
    }  

    public Sample(...) {
    }  
    
    // Method
    public void methodA() {
        //...
    }

    public void methodB() {
    }

    public void methodC() {
    }
    
}

혹시 여러분들은 클래스에 단락 별로 주석을 작성하시는거에 어떻게 생각하시나요? 저는 클래스 가자마자 얼타는 시간을 줄이기 + 눈이 안좋음 이슈.. 로 인해서 이렇게 작성하긴 해서요!

저는 개인적으로 불호이긴합니다 !

클래스를 처음 접하자마자 얼타는(파악)하는 시간을 줄이기 위한 과정을 IDE와 빈줄을 통해 충분히 해소될수 있다고 생각하는 편이라 그런것 같습니다 !

@softmoca
Copy link
Collaborator Author

Using for loop

public Members registerMembers(final List<String> names, final String teamName, final String backNumber) {
    List<Member> members = new ArrayList<>();
    for (String name : names) {
        BackNumber number = BackNumber.from(backNumber);
        Team team = Team.from(team);
        Member member = Member.from(number, team);
        members.add(member);
    }
    return Members.of(members);
}

Using Stream API

public Members registerMembers(final List<String> names, final String teamName, final String backNumber) {
    List<Member> members = names.stream()
            .map(name -> {
                BackNumber number = BackNumber.from(backNumber);
                Team team = Team.from(team);
                return Member.from(number, team);
            }).toList();
    return Member.of(cars);
}

저는 개인적으로 복잡한 객체의 생성의 경우 Stream API 보다는 for문이 가독성이 더 좋다고 생각합니다. 물론 주간에 filtering을 사용해야 한다면 Steam API가 괜찮다고 생각도 합니다.

만약 단순히 복잡한 객체의 생성이라면 여러분은 어떤 코드가 더 가독성이 높다고 생각하시나요? (이번 챕터가 가독성 관련이라 가독성 의견만 주시면 감사하겠습니다!)

우선 저도 복잡한 객체의 생성에서 가독성 측면에서는 for문이 더 좋다고 생각하긴합니다 !

저도 다른 분들의 코드를 보며 종종 같은 생각을 하긴 했는데 저 한정으로는 아직 Stream에 대해 낮설어서 그런면도 없지않아 있다고 생각이 들었습니다.

하지만 분명 Chap5의 Map에서 Key를 찾는 과정과 같은 특정한 상황에서는 Stream 사용이 가독성 측면에서나 효율 측면에서나 좋지않을때가 분명히 있는것 같습니다.

또한 개인적으로 객체 생성 과정이 여러단계로 나눠져있을 때 for 문은 순차적 흐름으로 코드 흐름 순서대로 읽기가 쉬워 가독성이 좋다고 생각됩니다.

디버깅시에도 for문을 사용하면 객체와 필드 상태를 중간에 확인하기 더 쉬워서 이런 측면에서도 저는 for문이 더 가독성이 좋다고 생각됩니다 !

@softmoca
Copy link
Collaborator Author

개발을 하다보면 도메인 지식도 어느정도 알고있어야 한다고 생각합니다. 예를들어 프롭테크 개발자가 부동산 도메인에 대해서 알지 못한다면 요구사항에 맞는 결과물을 내놓기 힘들다고 생각합니다. 그런데 도메인에 맞춰 개발 하게되면 통상적으로 쓰이지 않는 단어가 많이 사용될 것으로 예상됩니다.

여러분들은 어떻게 생각하시나요?

  • 의견1 ) 이 도메인을 첨 접하는 사람을 위해서 그냥 일반적인 네이밍을 사용한다.
  • 의견2 ) 아니다. 해당 도메인에 대한 용어와 일반 용어를 혼용해서 쓰면 추후 코드를 읽음에 있어 문제가 있을 것이다.

저는 의견 2에 동의를 합니다.

첫번째로, 도메인에서 쓰는 용어와 일반 용어를 혼용하면 코드의 일관성이 떨어지고, 특정 개념이 문맥에 따라 다르게 해석될 가능성이 있어 가독성에 문제가 생길것이라고 생각합니다.

이러한 문제를 해결하기 위해 처음 도메인을 접하는 분들이 온보딩과 같은 과정을 통해 도메인 지식을 축적하는 시간을 가지고 프로젝트에 투입이 되는것이 전체적으로 유익한 프로세스라고 생각됩니다 !

@softmoca softmoca self-assigned this Nov 3, 2024
@softmoca
Copy link
Collaborator Author

softmoca commented Nov 3, 2024

5.9 프로그래밍 언어의 새로운 기능을 적절하게 사용하라

가장 최신 Java21에서 virtual thread라는 기능이 등장했는데 (지금은 당장은 아니더라도)시간 나실 때, 이게 뭔지 정도는 알아보는 거 추천드립니다!!

이거..?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants