TIL47 [클린 코드] 2장 의미 있는 이름 의도가 분명하게 이름을 지어라 좋은 이름을 짓는데는 시간이 걸리지만 좋은 이름으로 시간을 절약하는 시간이 더 많다. 만약 따로 주석이 필요하다면 의도를 충분히 드러내지 못한 것이다. 그릇된 정보를 피해라 Ex) 빗변(hypotenuse) 을 hp로 줄인다면 훌륭한 약어처럼 보이겠지만 hp로 빗변을 직관적으로 떠올리거나 다른 의미로 인식할 수 있음 서로 비슷한 이름을 사용하지 않는 것도 중요 유사한 개념은 유사한 표기법을 사용해야한다 일관성이 떨어지는 표기법은 그릇된 정보다 불용어는 중복이다 ex) 변수에 variable은 중복, 표에 table 도 중복 ex2) getActiveAccount(), getActiveAccounts(),getActiveAccountInfo() 중 어떤 메소드가 원하는 메소드.. 독서 기록/클린 코드 2023. 1. 21. [클린 코드] 1장 깨끗한 코드 코드는 요구사항을 표현하는 수단 언어의 추상화 수준은 높아지고, 특정 응용 분야에 특화된 언어가 많아지는 등의 변화 있을 수 있음 But, 요구 사항을 모호하게 줘도 우리의 의도를 정확하게 파악하고 프로그램을 만들 수 있는 기계가 나올 수 없음 그렇기에 코드는 항상 존재할 것 나쁜 코드가 나오는 이유 시간상의 이유 등으로 나쁜 코드를 생산 아예 안돌아가는 프로그램보다 돌아가는 쓰레기가 좋다고 스스로 위로하는 일 흔함 그리고 나중에 다시 리팩토링하겠다는 다짐을 하지만 나중은 오지 않는다 (= 르블랑의 법칙) 나쁜 코드는 쌓일수록 생산성이 떨어짐 쌓일수록 수정과 개선의 난이도를 기하급수적으로 늘림 결국 생산성이 0에 수렴하고 재설계를 시도함 ( aka. 차세대, 빅뱅 등...) 재설계를 시도하는 팀은 기존 .. 독서 기록/클린 코드 2023. 1. 16. [Lambda] 람다를 활용한 image resize 람다를 활용한 image resize 에 관한 내용은 많다 AWS 에서 자체 자습서 자료를 만들었을 정도로 대표적인 활용 방식인 것 같다. 근데 이제 내가 이를 구현하면서 마주했던 에러를 이야기 해보자한다. 문제 상황 1. 그냥 안됨 => 코드상의 문제이다, 파일 경로와 문법 실수를 유의하자 2. 무한 재귀 => 람다 트리거를 잘못 설정한 경우 s3 버킷을 하나로 사용하는데 조건을 이미지가 업로드 시로 통으로 걸어버리면 이미지 리사이징한 것을 올릴 때에도 트리거가 발동되어 무한으로 이미지 리사이징을 즐길 수 있다 내가 진짜 골치 아팠던것은 3. 이미지 리사이징이 진짜 가끔식 되고 대부분의 케이스에서는 제대로 동작하지 않는 경우였다. 코드는 아무리 뜯어봐도 문제가 없고 계속 테스트 해보다 보면 간간히 한 .. TIL/삽질 기록소 2022. 11. 2. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.10 (Feat. 상태 패턴) 패턴이 나오게 된 문제 상황 각 상태에 따라 행동을 다르게 하고 싶은 경우 이를 상태 변수를 통해 해결하고자 함 => 우리가 정의하는 행동마다 어떤 상태인지를 구별하고(조건문) 이에 따라 어떤 작업을 수행할지 정의해야 함 public class GumballMachine { // 상태 변수로 표현 final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; final static int HAS_QUARTER = 2; final static int SOLD = 3; int state = SOLD_OUT; int count = 0; public GumballMachine(int count) { this.count = count; if (count > 0).. 독서 기록/디자인패턴 2022. 11. 1. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.3 (Feat. 데코레이터 패턴) 패턴이 나오게 된 문제 상황 예를 들어 카페에서 판매하는 음료를 표현하고자 할 때, 커피1, 커피2, 커피3, 커피4 이렇게 종류가 있고, 들어갈 추가 요소가 우유, 두유, 모카, 휘핑크림 등이 있다고 하였을 때 위에 말한 요소들의 조합을 모두 서브 클래스로 만든다면 4*2^4 = 64개의 서브 클래스가 생길 것이다. 만약 우유나 두유 등 추가 요소를 한번만 넣거나 마는 것이 아닌 2번 이상 넣을 수 있다고 가정하면 더욱 경우의 수가 늘어날 것이다. Adding Boolean Variables 로 해결한 경우 앞서 말한 예시에서의 추가 요소에 대한 boolean 변수를 만들어 해결하는 방식이다 이러한 경우 음료 클래스에서의 cost() 구현하고 하위 클래스는 cost()를 오버라이드하여 사용한다. => .. 독서 기록/디자인패턴 2022. 11. 1. [Debug]crontab으로 python 파일 실행 문제 상황 내가 원하는 것은 cron을 활용하여 매일 특정 시간에 추천 주제를 쌓아둔 DB에 접근하여 랜덤으로 값을 뽑아 다른 DB에 값을 써주는 작업을 하고 싶었다. 1. 앞서 말한 내가 원하는 작업을 python 파일로 작성 2. 이것을 crontab을 활용하여 실행 이렇게 진행하였는데 이제 1번은 완성되어 python3 main.py 이런식으로 동작시키면 원하는대로 동작하는 상황에서 crontab으로 main.py 를 동작시키면서 마주했던 에러들에 대해 작성해보자 한다. 해결 과정 내가 사용했던 ubuntu 기준으로 /var/log 의 syslog 파일에 cron관련 로그가 쌓였다. # CRON 관련 로그만 볼 수 있음 grep CRON syslog No MTA installed, discardin.. TIL/삽질 기록소 2022. 10. 27. [디자인 패턴] Composite Pattern Composite Pattern의 특징 트리와 같은 계층적인 정보에서 하위에 정보가 없는 리프노드, 자식이 있는 논 리프노드 가 있을 때, 이런 서로 다른 노드를 같은 인터페이스를 통하여 일관된 방식으로 프로그래밍할 수 있게 함 public class MenuItem extends MenuComponent { String name; String description; boolean vegetarian; double price; public MenuItem(String name, String description, boolean vegetarian, double price) { ... } public String getName() { return name; } public String getDescript.. 독서 기록/디자인패턴 2022. 10. 24. [디자인패턴] Iterator 패턴 Iterator 패턴의 목적 aggregate object의 내부 구현이나 구조를 보여주지 않으면서 aggregate object의 요소들에 접근할 수 있게 하는 것 aggregate object란 다른 object들을 모아두기 위한 객체 == (container, collection), ex) LinkedList, Hash Table... Iterator 패턴을 사용하지 않는 경우 for(int i=0;i< breakfastItems.size();i++){ MenuItem menuItem = (menuItem) breakfastItems.get(i); } for(int i=0;i< lunchItems.length;i++){ MenuItem menuItem = lunchItems[i]; } Iterato.. 독서 기록/디자인패턴 2022. 10. 24. [디자인 패턴] SOLID 원칙 The Single-Responsibility Principle (SRP) The Open-Closed Principle (OCP) The Liskov Substitution Principle (LSP) The Interface Segregation Principle (ISP) The Dependency Inversion Principle (DIP) The Single-Responsibility Principle (SRP) 클래스는 변경될 단 하나의 이유가 있어야 함 하나의 이유는 책임에서 비롯되기에 결국 단 하나의 책임을 지어야 한다 라는 의미 클래스가 지는 책임이란 의무 혹은 계약이다 클래스가 지는 책임이 많아질수록 자주 변경될 것이고 클래스가 자주 변경될수록 버그를 야기시키고 다른 이들에게 영향을 .. 독서 기록/디자인패턴 2022. 10. 18. [디자인 패턴] 중재자 패턴 vs 옵저버 패턴 중재자 패턴(Mediate Pattern)이란? 중재자 패턴(Mediate Pattern)은 서로 상호작용하는 객체들을 느슨한 결합(Loose coupling)을 통해 상호작용하는 작업을 캡슐화하는 것 장점 시스템과 객체를 분리함으로써 재사용성 향상 제어 로직을 한 군데로 분리했기에 관리하기 쉬움 객체들 사이에 오가는 메세지 줄이고 단순화할 수 있음 단점 중재자 객체가 너무 복잡해질 수 있음 서로 연관된 GUI 구성 요소를 관리하는데 많이 사용됨 vs Observer Pattern 중재자 패턴은 객체간의 상호작용을 한군데에 모음, 반대로 옵저버 패턴은 분리시킨다 중재자 객체를 재사용하기 어려움, 반대로 옵저버랑 주제는 재사용하기 쉬움 상호작용의 흐름 이해하기 쉬움, 반면 옵저버 패턴은 흐름 알기 어려움 독서 기록/디자인패턴 2022. 10. 17. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.5 (Feat. 싱글톤 패턴) 인스턴스 1개만 있어도 되는 객체가 많음 예를들어 스레드 풀, 캐시, 대화상자, 디바이스 드라이버 등등 이런 경우 오히려 2개 이상이면 오작동, 일관성이 깨짐 혹은 자원 낭비 등의 문제가 발생할 수 있음 싱글톤 패턴: 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공한다. 즉, 객체 인스턴스를 전역 변수처럼 어디서든 엑세스할 수 있게 함 또한 사용하지 않으면 자원이 낭비되는 전역 변수의 단점을 감수하지 않는다. 게으른 인스턴스 생성을 통해 필요할 때 인스턴스 생성하여 자원 낭비 막음 싱글톤 패턴을 제대로 구현하면 new를 써서 만들면 안됨 public class Singleton{ private static Singleton uniqueInstance; private Singleton(.. 독서 기록/디자인패턴 2022. 10. 17. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.7 (Feat.어댑터, 퍼사드 패턴) 어댑터 패턴(Adapter Pattern) 기존의 시스템과 연결된 시스템의 클래스가 서로 다르다면 중간에서 이를 변환해줄 어댑터가 필요함 public class TurkeyAdapter implements Duck{ Turkey turkey; public TurkeyAdapter(Turkey turkey){ this.turkey = turkey; } public void quack(){ turkey.gobble(); } public void fly(){ turkey.fly(); } } 클라이언트(Turkey)를 타깃 인터페이스(Duck)로 변환해주는 어댑터 클래스이다. public static void main(String[] args){ Turkey turkey = new Turkey(); Duck t.. 독서 기록/디자인패턴 2022. 10. 10. 이전 1 2 3 4 다음 반응형