https://gall.dcinside.com/board/view/?id=programming&no=2829956&fcno=9038098

적당한 프로그래밍.레거시 리팩토링을 나는 종종 하는 편임.왜냐면 이전 개발자가 좆같이 짠걸 수정하거나, 일정이 급해서 내 코딩중 해당 규모의 구조로 정리한걸나중에 내가 다시 기능 추가 보완을 하는 경우가 많음.내가 한건 아무런 문제가gall.dcinside.com

https://gall.dcinside.com/board/view/?id=programming&no=2829972&fcno=9038131

프로그래밍 언어는 왜 언어인가?프로그래밍 언어가 왜? 언어인지 모르는 애들이 많다.언어란 무엇인가?언어는 명사, 형용사, 동사 등으로 이루어져있다.촘스키 형님이 형식언어 문법 이론으로 잘 설명해주셨는데 형식언어를 매우 단순하게 설명하면S-&gall.dcinside.com




코딩의 기초는 응집도와 결합도를 아는 것입.

위의 글에서 이야기 한 것 처럼 코딩은 함수를 잘 만들어야함.



그러기 위해서 필요한 것은 응집도와 결합도에 대한 이해임.




응집도는 말 그대로 응집되는 것, 하나의 논리, 함수, 기능에 수렴하는 것을 말함.

소스코드는 수 많은 논리들로 이루어짐, 응집도가 높다는 것은, 이 논리들이 각각 개별로서 존재하며

상호작용 하고 있다는 것을 뜻함.




1차원 적으로 말하자면 각각의 응축으로 인해, 이것과 저것에 대한 구분이 생긴다는 것임.

이러한 구분을 언어적으로 지원하는게 함수임.




그렇다면 응집도를 이해한다는 것은 소스코드에서 무엇을 함수로 만들어야 할지에 대한 시각이 생긴다는 것과 같음.

그래서 초보들은 함수를 잘 만들지 못함. 응집도에 대한 이해력이 낮기 때문임.




이러한 응집도는 해당 프로그램 내에서의 기능적인 응집도가 있고, 비즈니스적 응집도가 있음.

초보들이 응집도를 어려워 하는 이유는 구조적인 응집도와 구현목표에 따른 응집도에 대한 구분을 어려워 하기 때문임.




구조적인 응집도는 레고블럭을 만드는 것과 같음.

레고 블럭을 만들어서 목표에 도달하고자 하는 것임.




반면에 비즈니스 적인 응집도는 바로 목표를 위한 응집도임.

찰흙, 시멘트, 자갈, 같은 것임.


그래서 틀을 잡지 못하면 코드가 개판이 되기 쉬움.




코딩이란 구조적인 응집도와 비즈니스 적인 응집도를 소스코드에서 구분할줄 알아야하며

비즈니스적인 목표를 구조적 응집도 위에 올릴줄 알아야함.




이것을 모르면, 함수를 알수가 없음.


무엇을, 어떻게, 어느정도로 단락을 끊어주어야 하는지 혼동이 오기에

초보들의 코드는 사람이 이해하기 짜증나는 코드가 됨.




구조적인 코드를 만들고 있다고 생각하는 초보들이 많음. 즉 기계적인 코드를 짜는 것임.

이건 비즈니스의 절차의 구조를 그대로 코딩을 하면서, 자기가 구조화된 코드를 짜고 있다고 생각하기 때문임.




응집도를 높이기 위한 지식은 cs계에 거의 없었음.

oop에서 약간, 클린코드류에서 기초적인 방법론을 얻을수 있을 뿐이었는데

리팩토링이 등장하면서 응집도를 높이는 기술이 가시적으로 나타난 것임.




그래서 몇일, 몇개월, 몇년 뒤에 소스코드를 다시 보면 이해하지 못한다는 말이 과거로부터 존재하는 것임. (과거에는 리팩토링을 몰랐으니까)

응집도가 뒤틀려 있기에 시간이 지나 소스코드를 보게될때, 해당 기능의 의미를 이해하기 어려움.

이것이 응집도에 대한 불완전한 이해로 짠 코드들의 결말임.




두번째 결합도도 마찬가지임.


응집도를 극한으로 높여 파라메터 결합도, 순서 결합도 수준에서 코드를 정리해 나가면

특정 기능의 처리로직과 리소스가 프로그램 구조에서 명확하게 드러나게됨.


이것들을 모아서 메인함수, 혹은 클래스로 구성을 하면 기본적인 하나의 기능을 코딩하여 완료했다고 말할수 있음.



코딩을 배워나가며, oop니 디자인패턴이니 이것저것을 배우고 있는데

가장 기본이 되는 것은 응집도와 결합도를 소스코드에서 볼수 있는 시각을 갖는 것임.


이런 기본중의 기본이 안되고, oop 디자인 패턴을 배워봤자 

겉멋만 든 병신같은 소스코드만 만들게됨.



기초가 가장 중요함.