어떤 종류의 코딩 anti-패턴 당신은 항상 리팩터링을 때 당신은 그들이 십자가?

StackOverflow https://stackoverflow.com/questions/390289

  •  23-08-2019
  •  | 
  •  

문제

나는 그냥 리팩터링하는 코드는 다른 섹션의 클래스 I was 에서 작업하기 때문에 그것은 시리즈의 중첩된 조건부 연산자(?:) 는 톤을 명확하여 매우 간단한 스위치 statement(C#).

을 때 당신이 접촉되지 않는 코드가 직접 일하고 있는 것을 더욱 명확한가?

도움이 되었습니까?

해결책

저는 한 번이었다 refactoring 가 이 같은 코드:

string strMyString;
try
{
  strMyString = Session["MySessionVar"].ToString();
}
catch
{
  strMyString = "";
}

---끝---이력서 지적했다.ToString()은 중복되는,그래서 내가 했다.불행하게도,결국을 깨는 코드입니다.때마다 MySessionVar 었 null,그것을 일으키는 든 코드에 의존하는 충돌 그것을 내려하고 있습니다.나는,이었다 슬픈 일부 코드입니다.그러나 나는 배우 좋은 교훈에서습니다.지 않는 급속하게 이동을 통해 기존의 코드에 의존하는 도구는 데 도움 당신이터베이-그것은 생각을 통해 자신입니다.

나는 끝까지 refactoring 그것은 다음과 같다:

string strMyString = Session["MySessionVar"] ?? "";

업데이트: 이 게시물이 되회가 직접 참여 할 수있는 기술적으로 포함되어 있지 않는 질문에 대답 생각해야 실제로 질문에 대답.(Ok,그것은 나를 괴롭히는 지점에는 내가 사실은 그것에 대해 꿈을 꾸고.)

개인적으로 나는 나 자신에게 몇 가지 질문하기 전에 refactoring.

1)시스템에서 원본을 통제하십니까?그렇다면,앞서 가과 리팩터링할 수 있기 때문에 항상 다시 뭔가 중단됩니다.

2)단위 테스트를 위해 존재하는 기능이 내가 바꿔?그렇다면,좋다!리팩터링.위험은 여기는 존재를 단위의 시험을 표시하지 않는 정확도와 범위를 말한 단위 테스트를 확인할 수 있습니다좋은 유닛 테스트를 선택해야 하는 모든 주요 변경 내용.

3)나는 철저하게 이해하는 코드가 나는 refactoring?이 없는 경우 원본을 제어하고 테스트하고 내가 이해하지 못하고 코드가 나는 변화는 빨간색 플래그입니다.나 좀 더 필요한 코드와 함께하기 전에 refactoring.

는 경우#3 나는 가능하게 시간을 보내고 실제로 모두를 추적하는 코드의 현재 방법을 사용하여 나 refactoring.범위에 따라 코드의 이 될 수 있을 쉽게 불가능하거나(ie.그것은 공공 API).는 경우 그것은 공개되는 API 는 다음 당신이 정말로 이해할 필요가가 원래 의도하는 코드의 비즈니스 관점에서.

다른 팁

테스트가 이미있는 경우에만 리팩터링합니다. 그렇지 않다면 일반적으로 테스트를 작성하는 데 시간이 가치가 없습니다. 그리고 리팩터가 아마도 작동하는 코드입니다.

이것은 작고 사소한 반포 란이지만 너무 자극합니다. 내가 그것을 찾을 때마다, 나는 그것을 즉시 삭제합니다. C (또는 C ++ 또는 Java)에서

if (p)
    return true;
else
    return false;

becomes

return p;

계획에서

(if p #t #f)

becomes

p

그리고 ML에서

if p then true else false

becomes

p

나는이 안티 패턴이 거의 독점적으로 본다 학부생이 작성한 코드. 나는 확실히이다 이것을 만들지 않습니다!!

내가 그것을 만날 때마다, 나는 그것을 바꾸는 것이 문제를 일으킬 것이라고 생각하지 않을 때마다 (예 : 그것이 무엇을하는지 알기에 충분히 이해할 수 있습니다. 예를 들어 부두의 수준은 낮습니다).

코드를 수정하는 다른 이유가있는 경우에만 변경하는 것이 귀찮습니다.

내가 얼마나 멀리 가져 가고 싶은지는 내가 아무것도 깨지 않을 것이라고 확신하고 코드에 대한 내 자신의 변화가 얼마나 광범위한 지에 달려 있습니다.

이것은 단위 테스트의 이점을 과시하기에 좋은 상황입니다.

단위 테스트가 마련된 경우 개발자는 맹렬하고 적극적으로 홀수로 작성된 코드를 재현 할 수 있습니다. 그것이 단위 테스트를 통과하고 가독성을 높이면, 당신은 하루 동안 좋은 행동을했고 계속 진행할 수 있습니다.

단위 테스트가 없으면 Voodoo로 가득 찬 복잡한 코드를 단순화하면 코드를 깨뜨릴 위험이 높아지고 새로운 버그를 도입했다는 것을 알지 못합니다! 따라서 대부분의 개발자는 신중한 길을 따라 계속 진행할 것입니다.

간단한 리팩토링을 위해 깊게 중첩 된 제어 구조와 실제로 긴 기능 (하나 이상의 화면 상당의 텍스트)을 정리하려고합니다. 그러나 정당한 이유없이 (특히 많은 개발자 팀에서) 코드를 리팩터링하는 것은 좋은 생각이 아닙니다. 일반적으로, 리팩토링이 코드를 크게 개선하거나 심한 죄를 해결하지 않는 한 나는 충분히 혼자서 떠나려고 노력합니다.

매당 리팩토링되지 않고 일반 하우스 키핑의 문제로서 나는 일반적으로 모듈에서 작업을 시작할 때이 작업을 수행합니다.

  • 어리석은 댓글을 제거하십시오
    • 이미 함수 서명보다 이미 말하는 댓글
    • "그냥 어떻게 생겼는지"와 같은 순수한 관용구 인 댓글
    • 파일 상단의 changelogs (이유에 대한 버전 제어가 있습니다)
    • 코드와 명확하게 동시성이없는 API 문서
  • 주석된 코드 덩어리를 제거하십시오
  • 누락 된 경우 $ id $와 같은 버전 제어 태그 추가
  • 공백 문제를 해결하십시오 (이것은 당신이 한 모든 일이 공백을 바꾸는 것이더라도 많은 줄에 이름이 나타나기 때문에 다른 사람들에게 성가시킬 수 있습니다).
    • 줄 끝에서 공백을 제거하십시오
    • 변경 탭-> 공간 (내가 일하는 우리의 컨벤션입니다)

리팩터가 코드를 만드는 경우 많이 읽기 쉽고, 가장 일반적인 것은 중복 코드, 예를 들어 첫 번째/마지막 명령에 의해서만 다릅니다.

if($something) {
  load_data($something);
} else {
  load_data($something);
  echo "Loaded";
  do_something_else();
}

더 이상 (아마도) 3-4 줄의 중복 코드 언제나 리팩토링에 대해 생각하게합니다. 또한, 나는 코드를 많이 움직이는 경향이 있으며, 더 자주 사용될 것으로 예측하는 코드를 별도의 장소로 추출하는 경향이 있습니다. 내 utils.* 네임 스페이스).

그러나 귀하의 질문에 답하기 위해, 코드를 짧게 만드는 것이 반드시 잘 구조되고 읽기 쉬운 것은 아닙니다. 사용 ?? C#의 연산자가 또 다른 예입니다. 당신이 생각해야 할 것은 당신의 선택 언어의 새로운 기능입니다 - 예를 들어 LINQ는 매우 우아한 방식이지만 매우 간단한 것을 읽을 수 없게 만들 수 있습니다. 지나치게 복잡합니다. 이 두 가지를 매우 신중하게 평가해야합니다. 결국에는 모든 것이 당신의 개인적인 취향과 대부분 경험으로 요약됩니다.

글쎄, 이것은 또 다른 "그것이 의존한다"는 대답이지만, 나는 그것이되어야한다는 것을 두려워합니다.

나는 거의 항상 2> 2의 유사한 조건부를 스위치에 깰 수 있습니다 ... 대부분 열거와 관련하여 종종. 긴 진술 대신 반환을 짧게하겠습니다.

전:

if (condition) {
  //lots of code
  //returns value
} else {
  return null;
}

:

if (!condition)
  return null;

//lots of code..
//return value

조기에 침입하면 추가의 계약이 줄어들고 긴 코드의 긴 코드가 줄어 듭니다. 또한 일반적인 규칙으로서 나는 10-15 줄 이상의 코드를 가진 방법을 좋아하지 않습니다. 내부적으로 더 많은 개인 방법을 만들더라도 단일 목적을 갖는 방법을 좋아합니다.

일반적으로 코드를 탐색하는 경우 코드를 리팩터링하지 않고 적극적으로 작업하지 않습니다.

그러나 때로는 Resharper가 Alt+Enter에 저항 할 수없는 몇 가지 사항을 지적합니다. :)

블록에 입력과 출력 세트를 이해하면 매우 긴 기능과 방법을 리팩터링하는 경향이 있습니다.

이것은 가독성이 끝나지 않는 데 도움이됩니다.

나는 내가 만나는 코드 만 리팩터링하고 다음 단계를 수행 한 후에 적극적으로 작업하지 않을 것입니다.

  • 코드의 저자 (항상 불가능한 것은 아님)와 대화하여 해당 코드가 무엇을하는지 파악하십시오. 코드가 무엇을하고 있는지에 대해 나에게 분명하더라도 저자가 특정 방식으로 무언가를하기로 결정한 이유의 근거를 이해하는 데 항상 도움이됩니다. 몇 분 동안 이야기하는 것은 원래 저자가 당신의 관점을 이해하는 데 도움이 될뿐만 아니라 팀 내에서 신뢰를 쌓는 데 도움이 될 것입니다.
  • 재 점수 후 테스트하기 위해 해당 코드가 무엇을하고 있는지 알고 알아보십시오 (단위 테스트를 통한 빌드 프로세스는 여기에서 매우 도움이됩니다. 모든 것을 빠르고 쉽게 만듭니다). 변경 전후에 단위 테스트를 실행하고 변경으로 인해 아무것도 깨지지 않도록하십시오.
  • 팀에게 헤드를 보내고 (다른 사람들과 협력하는 경우) 다가오는 변화에 대해 알리십시오.

그것을위한 리팩토링은 모든 악의 뿌리 중 하나입니다. 제발하지 마십시오. (단위 테스트는 이것을 다소 완화합니다).

댓글을 달린 코드의 광대 한 무리는 반포 란입니까? 구체적으로 코드는 아니지만 (주석) 소스 제어를 사용하는 방법을 이해하지 못하고 나중에 오래된 코드를 유지하려는 사람들과 이런 종류의 행동을 많이보고있어 더 쉽게 돌아갈 수 있습니다. 버그가 소개되었습니다. 댓글을 달린 광대 한 코드를 볼 때마다 거의 항상 전체를 제거합니다.

다음 요소를 기반으로 리팩토링을 시도합니다.

  1. 무슨 일이 일어나고 있는지 알기에 충분히 이해합니까?
  2. 이 변경이 코드를 중단하면 쉽게 되돌릴 수 있습니까?
  3. 변경 사항이 빌드를 중단하면 되돌아 갈 시간이 충분할 것입니다.

그리고 때로는 시간이 충분하다면 배우기 위해 리팩터를 리팩터링합니다. 마찬가지로, 나는 내 변화가 코드를 깨뜨릴 수 있다는 것을 알고 있지만 어디서 어떻게 알지 못합니다. 그래서 나는 어쨌든 그것을 바꾸기 위해 그것을 바꾸고 그 이유를 알아냅니다. 그렇게하면 코드에 대해 더 많이 배웁니다.

내 도메인은 대부분의 코드가 내 PC에 상주하고 다른 코드에 영향을 미치지 않는 모바일 소프트웨어 (휴대 전화)였습니다. 또한 회사의 CI 빌드 시스템을 유지 관리하기 때문에 리팩토링 된 코드에서 모든 전화기 (모든 전화 용)를 실행하여 다른 것을 깨뜨리지 않도록 할 수 있습니다. 그러나 그것은 당신이 가지고 있지 않은 나의 개인적인 사치입니다.

나는 낮은 리팩터 위험으로 간주 될 수 있다면 글로벌 상수와 열거를 상당히 리팩터링하는 경향이 있습니다. 어쩌면 그것은 단지 그럴 수도 있지만, clientAccountStatus enum과 같은 것은 GlobalConstandEnum 클래스가 아닌 ClientAccount 클래스에 있거나 가깝게되어야합니다.

명확하게 잘못되었거나 명확하게 무의미한 주석의 삭제/업데이트.
그들을 제거하는 것은 다음과 같습니다.

  1. 안전한
  2. 버전 제어는 다시 찾을 수 있음을 의미합니다
  3. 코드의 품질을 다른 사람과 자신에게 향상시킵니다.

내가 아는 유일한 100% 위험 무료 리팩토링에 관한 것입니다.

이 작업을 수행합니다 구조 Javadoc 댓글과 같은 의견은 다른 문제입니다. 이것들을 변경하면 위험이 없어서 ~할 것 같은 표준 부정확 한 코드 주석에 따라 고정/제거되었지만 죽지 않은 특정 보장 된 수정 사항.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top