감각이 나쁜 코드
코딩 감각
코딩에 센스는 있을까.
최적의 아키텍처를 선택하는 것일까.
테스타빌리티, 변경 용이성이 높은 코드를 쓰는 것일까.
어쨌든 빨리 코드를 작성하는 것일까.
사람에 따라 다양하다고 생각하지만,
리너스 토벌스에게 센스가 있는 사람은
크게 보고 직감으로 올바른 코드를 아는 사람인 것 같다.
예를 들어, 어떤 if문의 특수 케이스를 일반화할 수 있다고 깨뜨릴 수 있는 사람이다.
다음의 예는 상기 동영상으로 소개된 코드편을 움직이는 코드로 바꾼 것이다.
#include "common.h"
typedef struct linked_list
{
int value;
struct linked_list* nextp;
} linkedlist;
linkedlist* firstlistp = NULL;
void initList(int value);
void addList(int value);
linkedlist* findList(int value);
void deleteList(linkedlist* entry);
void printList();
int main()
{
initList(11);
addList(12);
addList(13);
addList(14);
addList(15);
addList(16);
addList(17);
printList();
puts("TEST A");
linkedlist* lp = findList(14);
deleteList(lp);
printList();
puts("TEST B");
lp = findList(12);
deleteList(lp);
printList();
puts("TEST C");
lp = findList(16);
deleteList(lp);
printList();
puts("TEST D");
return 0;
}
void initList(int value)
{
linkedlist* newp;
newp = malloc(sizeof(linkedlist));
newp->value = value;
newp->nextp = NULL;
firstlistp = newp;
}
void addList(int value)
{
linkedlist* newp;
newp = malloc(sizeof(linkedlist));
newp->value = value;
newp->nextp = firstlistp;
firstlistp = newp;
}
linkedlist* findList(int value)
{
linkedlist* currentp;
currentp = firstlistp;
while((currentp != NULL) && (currentp->value != value))
{
currentp = currentp->nextp;
}
return currentp;
}
#define BAD
void deleteList(linkedlist* entryp)
{
#ifdef BAD
linkedlist* prevp = NULL;
linkedlist* walkp = firstlistp;
while(walkp != entryp)
{
prevp = walkp;
walkp = walkp->nextp;
}
if(!prevp)
{
firstlistp = entryp->nextp;
}
else
{
prevp->nextp = entryp->nextp;
}
#else
linkedlist** indirectpp = &firstlistp;
while((*indirectpp) != entryp)
indirectpp = &(*indirectpp)->nextp;
*indirectpp = entryp->nextp;
#endif
free(entryp);
}
void printList()
{
linkedlist* currentp = firstlistp;
while(currentp != NULL)
{
printf("%d\n", currentp->value);
currentp = currentp->nextp;
}
}
소개된 것은 deleteList 함수.
BAD 루트와 else 루트의 차이점에는 if 문이 없습니다.
특수 경로가 사라지고 일반화되었습니다.
가독성
코드 품질의 이야기를 할 때, 가독성의 화제가 올라간다.
BAD 코드는 읽기 쉬운 것일까.
리뷰에서이 코드가 나오면 BAD 코드를 선택할 수 있습니다.
어쨌든 내 직장에서는 그렇다고 생각한다.
감각이 나쁜 코드
어떤 기능을 실현하는데 있어서 방법이 다수 있는 것이 대부분이라고 생각한다.
논의에 나오는 것은 실행 속도, 가독성, 확장 용이성 등일 것이다.
실행 속도는 계측할 수 있으므로, 보다 빠르고 느린 것은 객관적으로 판단할 수 있지만,
가독성은 사람에 따라 견해가 다르고 확장 용이성도 어디가 변경되는지 모르는 이상 한계가 있다.
어디까지 설정 파일에 의존할지도 관련되어 온다.
센스의 좋은 나쁜은 상황에 의할지도 모른다.
하지만, 각각의 상황에 대해 센스가 좋은 코드는 존재하고 있다.
리너스씨가 말하고 있는 것은 코드의 코드의 좋고 나쁜 것이 있고, 그것을 직감으로 아는 사람이 있다고 하는 것.
어렵다.
여담
무슨 말을 하고 싶은지 생각하지 않고 쓰기 시작하면 결국 끝까지 모르고 결론이 없는 기사가 되어 버렸다.
나에게는 코딩의 센스도 문장의 센스도 없는 것 같다.
C언어 입문 이후 링크리스트를 썼다. 지금까지 업무로 스스로 쓰는 일은 없었다.
그래서 오랜만에 썼지만 링크리스트는 상당히 어렵다고 생각합니다.
처리적으로 이것보다 어려운 것은 있지만 프로그램 초보자가 쓰는 데는 장애물이 높다고 생각했다.
추가할 때 앞에 추가한다는 개념, 삭제 함수 처리 이 2개의 장애물이 높다.
하면 할 수 있고, 잘못되면 바로 SEGV하기 때문에 디버깅하기 쉽고, 좋은 흔들림으로서는 기능하고 있을지도 모른다.
초심으로 돌아와 그림을 쓰면서 코딩하면 아무도 모르는 그림이 됐다. 나에게는 그림의 센스도 없는 것일까. . .
Reference
이 문제에 관하여(감각이 나쁜 코드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/todu/items/9e41f90a8a5d08889dc3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include "common.h"
typedef struct linked_list
{
int value;
struct linked_list* nextp;
} linkedlist;
linkedlist* firstlistp = NULL;
void initList(int value);
void addList(int value);
linkedlist* findList(int value);
void deleteList(linkedlist* entry);
void printList();
int main()
{
initList(11);
addList(12);
addList(13);
addList(14);
addList(15);
addList(16);
addList(17);
printList();
puts("TEST A");
linkedlist* lp = findList(14);
deleteList(lp);
printList();
puts("TEST B");
lp = findList(12);
deleteList(lp);
printList();
puts("TEST C");
lp = findList(16);
deleteList(lp);
printList();
puts("TEST D");
return 0;
}
void initList(int value)
{
linkedlist* newp;
newp = malloc(sizeof(linkedlist));
newp->value = value;
newp->nextp = NULL;
firstlistp = newp;
}
void addList(int value)
{
linkedlist* newp;
newp = malloc(sizeof(linkedlist));
newp->value = value;
newp->nextp = firstlistp;
firstlistp = newp;
}
linkedlist* findList(int value)
{
linkedlist* currentp;
currentp = firstlistp;
while((currentp != NULL) && (currentp->value != value))
{
currentp = currentp->nextp;
}
return currentp;
}
#define BAD
void deleteList(linkedlist* entryp)
{
#ifdef BAD
linkedlist* prevp = NULL;
linkedlist* walkp = firstlistp;
while(walkp != entryp)
{
prevp = walkp;
walkp = walkp->nextp;
}
if(!prevp)
{
firstlistp = entryp->nextp;
}
else
{
prevp->nextp = entryp->nextp;
}
#else
linkedlist** indirectpp = &firstlistp;
while((*indirectpp) != entryp)
indirectpp = &(*indirectpp)->nextp;
*indirectpp = entryp->nextp;
#endif
free(entryp);
}
void printList()
{
linkedlist* currentp = firstlistp;
while(currentp != NULL)
{
printf("%d\n", currentp->value);
currentp = currentp->nextp;
}
}
코드 품질의 이야기를 할 때, 가독성의 화제가 올라간다.
BAD 코드는 읽기 쉬운 것일까.
리뷰에서이 코드가 나오면 BAD 코드를 선택할 수 있습니다.
어쨌든 내 직장에서는 그렇다고 생각한다.
감각이 나쁜 코드
어떤 기능을 실현하는데 있어서 방법이 다수 있는 것이 대부분이라고 생각한다.
논의에 나오는 것은 실행 속도, 가독성, 확장 용이성 등일 것이다.
실행 속도는 계측할 수 있으므로, 보다 빠르고 느린 것은 객관적으로 판단할 수 있지만,
가독성은 사람에 따라 견해가 다르고 확장 용이성도 어디가 변경되는지 모르는 이상 한계가 있다.
어디까지 설정 파일에 의존할지도 관련되어 온다.
센스의 좋은 나쁜은 상황에 의할지도 모른다.
하지만, 각각의 상황에 대해 센스가 좋은 코드는 존재하고 있다.
리너스씨가 말하고 있는 것은 코드의 코드의 좋고 나쁜 것이 있고, 그것을 직감으로 아는 사람이 있다고 하는 것.
어렵다.
여담
무슨 말을 하고 싶은지 생각하지 않고 쓰기 시작하면 결국 끝까지 모르고 결론이 없는 기사가 되어 버렸다.
나에게는 코딩의 센스도 문장의 센스도 없는 것 같다.
C언어 입문 이후 링크리스트를 썼다. 지금까지 업무로 스스로 쓰는 일은 없었다.
그래서 오랜만에 썼지만 링크리스트는 상당히 어렵다고 생각합니다.
처리적으로 이것보다 어려운 것은 있지만 프로그램 초보자가 쓰는 데는 장애물이 높다고 생각했다.
추가할 때 앞에 추가한다는 개념, 삭제 함수 처리 이 2개의 장애물이 높다.
하면 할 수 있고, 잘못되면 바로 SEGV하기 때문에 디버깅하기 쉽고, 좋은 흔들림으로서는 기능하고 있을지도 모른다.
초심으로 돌아와 그림을 쓰면서 코딩하면 아무도 모르는 그림이 됐다. 나에게는 그림의 센스도 없는 것일까. . .
Reference
이 문제에 관하여(감각이 나쁜 코드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/todu/items/9e41f90a8a5d08889dc3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
무슨 말을 하고 싶은지 생각하지 않고 쓰기 시작하면 결국 끝까지 모르고 결론이 없는 기사가 되어 버렸다.
나에게는 코딩의 센스도 문장의 센스도 없는 것 같다.
C언어 입문 이후 링크리스트를 썼다. 지금까지 업무로 스스로 쓰는 일은 없었다.
그래서 오랜만에 썼지만 링크리스트는 상당히 어렵다고 생각합니다.
처리적으로 이것보다 어려운 것은 있지만 프로그램 초보자가 쓰는 데는 장애물이 높다고 생각했다.
추가할 때 앞에 추가한다는 개념, 삭제 함수 처리 이 2개의 장애물이 높다.
하면 할 수 있고, 잘못되면 바로 SEGV하기 때문에 디버깅하기 쉽고, 좋은 흔들림으로서는 기능하고 있을지도 모른다.
초심으로 돌아와 그림을 쓰면서 코딩하면 아무도 모르는 그림이 됐다. 나에게는 그림의 센스도 없는 것일까. . .
Reference
이 문제에 관하여(감각이 나쁜 코드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/todu/items/9e41f90a8a5d08889dc3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)