재구성은 변수 이름을 수정하고 디렉터리를 재배치하는 간단한 물리적 재구성일 수도 있고 서브 함수를 추출하고 불필요한 설계를 간소화하는 등 약간 복잡한 논리적 재구성일 수도 있다.그러나 기존 코드의 기능은 바뀌지 않는다. 적-추악한 코드 이해
비대한 클래스 개발자들은 가장 기본적인 인코딩 원칙, 즉'단일 직책 원칙'(SRP)에 대한 이해가 부족하다.개발자들은 이런 기능들이 이 같은 종류에 놓여야 하는지 생각하지 않는다. 이로 인해 이런 종류는 매우 비대해지고 하나의 종류가 수천 줄을 만들어 다음 엔딩맨을 울먹이게 한다.
비대한 방법은 수십 수백 줄에 달하는 함수 하나를 한데 쌓아 과정에 대한 사상으로 코드를 쓴다.
함수 매개 변수가 너무 많으면 호출자가 방법을 이해하기 어렵고 매개 변수가 헷갈릴 수 있다.하나의 함수가 5개의 int값 매개 변수를 연속으로 전달하는 것을 상상해 보세요. 누가 누군지 분간할 수 있습니까?매개 변수를 하나의 대상으로 구성하여 전달할 수 있는 것을 권장합니다.
층층이 끼워 넣은 판단은 논리가 복잡하지 않으면 if-else의 지점 소포를 최대한 줄이면 다른 사람들이 읽기가 너무 어렵다.예를 들어 조건을 만족시키지 못하면 직접return을 하고 다른 코드를 가지 않으면 끼워 넣는 것을 줄일 수 있다.
만편달리기의 상수값은 한 종류에 여러 가지 이름이 없는 상수값이 나타난다.0, 1200 등등이 천지를 뒤덮었다.이런 상태 코드의 의미가 바뀌면 코드를 바꾸면 너를 울게 할 것이다.통일된 상량 변수를 먼저 성명해서 사용할 수 없겠습니까?
애매모호한 명칭은 이름에 따라 그 기능을 한눈에 알아볼 수 없다.물론 생소한 단어는 제외된다.모호하고 기능적 의미가 없는 명칭은 읽기에 큰 어려움을 준다.
재구성의 길
분할 대함수: Break Method는 함수가 비교적 크면 기능 노드에 따라 여러 개의 소함수로 분할할 수 있고 그 중의 소함수도 공용할 수 있다.예를 들어 쇼핑 카트를 결제하는 것은 각종 상품의 총 가격을 계산하고 할인을 계산하며 만감 혜택을 계산한다. 만약에 한 방법이 집행된다면 다른 사람들은 논리만 있으면 처음부터 끝까지 한 번 읽어야 한다.세 개로 나누면 이 논리가 무엇을 했는지 한눈에 알 수 있다.쓰는 방법은 한 입에 뚱보를 먹는 것을 절대 삼가야 한다.
부류에 봉인: 비슷한 기능과 코드를 실행하려면 부류에 이 방법을 넣거나 업무 도구 종류로 추출할 수 있다.
Move Method----방법 이전은'단일 직책'원칙을 준수하고 클래스 중의 방법이 현재 클래스에 적합하지 않을 때 이 방법에 적합한 하가를 찾아야 한다.방법과 결합된 클래스로 이동합니다.한 방법이 다른 클래스에서 사용하는 것보다 더 자주 사용될 때, 우리는 방법을 더 자주 사용하는 클래스로 재구성해야 한다.
Move Field---- 옮기는 필드는 한 클래스의 한 필드가 다른 클래스의 대상에게 빈번하게 사용될 때 이 필드의 위치를 바꾸는 것을 고려해야 한다
Extract Class---추출류 한 종류가 너무 복잡하고 많은 일을 하여'단일 직책'의 원칙에 어긋나기 때문에 독립된 모듈을 분리해야 한다. 당연히 한 종류에서 여러 종류를 분리할 수 있다.클래스에 대한 세분화도 코드의 중복성을 줄이고 코드의 복용성을 높여 코드의 유지보수에 편리하도록 하기 위한 것이다.
레벨업 메소드, 필드(Pull Up Method)가 레거시 체인 상단으로 메소드를 마이그레이션하는 프로세스입니다.한 방법이 여러 실현자에게 사용될 때 사용합니다.계승 체계에서 여러 클래스가 같거나 유사한 방법을 사용한다면 이 방법을 베이스로 추출하고 베이스가 없으면 하나를 만드는 것을 고려할 수 있다.필드 승급과 같은 방법입니다.
낮추는 방법은 부류 추상적인 방법으로 여러 부류를 실현시킨다.여러 개의 자류는 같은 기능을 가지지만 각각의 구체적인 실현 방법이 있다. 그러면 이런 봉인은 다태성을 사용할 수 있다. 부류는 추상적인 방법을 만들고 방법의 실현을 자류로 낮출 수 있다.
중복 코드의 추출은 때때로 프로젝트의 진도를 따라잡기 위해 기능을 빨리 완성하기 위해 기능을 실현한 코드를 한 번 복제하여 직접 사용하기도 한다.여분의 것을 삭제하고 하나를 보류하면 아마도 한두 개의 매개 변수만 전달하면 여러 곳에서 호출할 수 있는 방법으로 봉인할 수 있을 것이다.
변수 이름바꾸기(클래스, 방법, 변수)는 매우 중요하다. 과장하지 않고 말하자면 이름의 수준은 프로그래밍 능력의 높낮이를 나타낸다.재구성하는 과정에서 클래스 이름이 현재 버전에서 그의 기능적 의미에 부합되지 않는 것을 발견하면 이를 다시 명명하는 것을 고려해야 한다.
주석을 추가하여 전역 변수, 공용 함수, 논리가 복잡한 부분에 주석을 추가하여 이전의 누락을 보완한다.
비교적 긴 판단이나 코드 연산을 임시 변면으로 임시 저장
if(stateCode = OK && datas != null && canShow)
function(Math.random((num1-num2)*num3))
위와 같은 긴 판단 조건과 매개 변수는 이 코드가if판단 조건을 변수로 작성하고 변수 판단에 넣고function 매개 변수를 국부 변수로 작성하여 결과를 저장한 다음에 방법을 전달해야 한다.
일반 봉인을 사용하여 통일된 방법이나 종류
함수는 과도한 매개 변수가 읽는 복잡성을 초래하는 것을 피해야 한다
public void requestPhoneThirdRegister(String loginway, String nickname, String openId, String token, String expires, String phone, final CallBackimpl callBackimpl)
이런 방법으로 직접 파라미터를 전달하는 것은 너무 길어서 코드의 가독성을 심각하게 떨어뜨린다.우리는 매개 변수 변수를 하나의 실체류에 쓸 수 있다. 구조 방법을 통해 대상 속성 값을 초기화하고 한 대상만 전달하면 해결되며 매개 변수의 증가와 감소가 가져오는 변동 문제를 해결할 수 있다.
중첩 조건 분기 최적화
if(){
if(){
if(){
}
}
}else{
}
여러분도 이런 화살표 코드를 많이 보셨을 거예요. 아무리 해도 풀 수 없는 매듭처럼.이런 코드를 만나면 반드시 가능한 한 최적화해야 한다.일반적인 방법: 문장을 판단하고if조건이 성립되며 코드 블록을 실행한다. 에이, 이렇게 하면 끼워 넣는 등급이 생성된다.최적화의 핵심 사상: 만족하지 않는 조건을 직접적으로 판단하고if조건이 성립되며return을 직접적으로 판단하여 가능한 한 빨리 방법을 벗어나 끼워 넣는 등급을 줄인다.두 번째: 조건 판독을 합치다
그리고 부정으로 이 조건을 판단하면 일시적으로 바뀌지 않아 조건 판단이 반대로 바뀔 수 있다.물론 두뇌가 유연해서 이걸 소홀히 하는 건
동북쪽에서 푹 끓인 유틸 클래스를 제거한다. 우리가 코드를 쓸 때 우연히 공용 방법을 뽑아야 할 때 일시적으로 적당한 클래스를 찾지 못하고 XXUtil이나 XXManager 클래스에 마음대로 넣는다.이대로 가면 이 종류에 포함된 기능이 점점 복잡해지고 dp와 px가 그 안에 전환된다. 화면 사이즈와 관련된 방법은 그 안에 있고 날짜가 그 안에 전환되며 암호화의 아예 그 안에 넣는다. 그러면 네트워크가 있는지 없는지, 네트워크 유형 판단도 넣어라.이것은 쓰레기장 같지 않습니까? 각종 잡동사니가 그 안에 쌓여 있고 단일 직책 원칙에 부합되지 않기 때문에 위의 기능 블록에 따라 여러 직책이 단일한 종류로 분해해야 합니다.종류가 많으면 상관없지만, 관건은 직책이 단일해야 한다.
만편의 마귀 숫자와 문자열을 정의된 상수로 표시한다.만약 특정한 클래스나 모듈이 이 상수를 필요로 한다면, 대응하는 클래스에 설명하십시오.전역 프로젝트에서 사용할 상수라면 프로젝트의 상수 설정 파일로 올립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: