실천 중의 재 구성 10평평 하고 직 설 적 인 코드
코드 단계 에서 도 여러 가지 방식 으로 이 차 이 를 줄 일 수 있다.
먼저 다음 코드 를 보 세 요. 수요 와 장면 은 이 렇 습 니 다.
사용자 목록 을 조회 하고 정 수 를 입력 하 며 사용자 수 를 되 돌려 주 는 상한 선 을 지정 합 니 다.
3 개의 서로 다른 데이터 소스 가 사용자 정 보 를 조회 할 수 있 는데 이 3 개의 데이터 소스 는 조회 할 때 우선 순위 가 있다.즉, 첫 번 째 데이터 원본 을 먼저 조회 하고 받 은 사용자 수가 상한 보다 적 으 면 두 번 째 데이터 원본 으로 조회 하고 상한 보다 적 으 면 세 번 째 데이터 원본 으로 조회 하 는 것 이다.
public List<User> getUserList_0(int maxSize) {
List<User> userList;
int selectSize = 0;
userList = getUserListFromSource1(maxSize);
if (null != userList) {
if (userList.size() < maxSize) {
selectSize = maxSize - userList.size();
List<User> userList2 = getUserListFromSource2(selectSize);
if (null != userList2 && !userList2.isEmpty()) {
userList.addAll(userList2);
if (userList.size() < maxSize) {
selectSize = maxSize - userList.size();
List<User> userList3 = getUserListFromSource3(selectSize);
if (null != userList3 && !userList3.isEmpty()) {
userList.addAll(userList3);
}
}
}
}
} else {
userList = getUserListFromSource2(maxSize);
if (userList.size() < maxSize) {
selectSize = maxSize - userList.size();
List<User> userList4 = getUserListFromSource3(selectSize);
if (null != userList4 && !userList4.isEmpty()) {
userList.addAll(userList4);
}
}
}
return userList;
}
만약 네가 인내심 을 가지 고 이 코드 를 다 보 았 다 면 나 는 탄복 할 수 밖 에 없다.5 층 의 if 내장 을 한눈 에 보 니 나 는 이미 반 멀미 상태 이다.나 는 이 코드 를 다 읽 을 인내심 이 없다 는 것 을 인정한다.
이 방법의 수요 와 장면 은 모두 비교적 간단 하기 때문에 간단 한 서법 이 있어 야 한다.
다시 쓰 는 코드 는 다음 과 같 습 니 다.
public List<User> getUserList_1(final int maxSize) {
List<User> userList = new ArrayList<User>();
List<User> temList;
int selectSize = maxSize - userList.size();
temList = getUserListFromSource1(selectSize);
if (temList != null) {
userList.addAll(temList);
}
if (userList.size() >= maxSize) {
return userList;
}
selectSize = maxSize - userList.size();
temList = getUserListFromSource2(selectSize);
if (temList != null) {
userList.addAll(temList);
}
if (userList.size() >= maxSize) {
return userList;
}
selectSize = maxSize - userList.size();
temList = getUserListFromSource3(selectSize);
if (temList != null) {
userList.addAll(temList);
}
return userList;
}
여기 서 먼저 매개 변수 에 final 수식 자 를 붙 여 방법 에서 이 매개 변 수 를 수정 하지 않 을 것 임 을 명 확 히 밝 혔 다.그 다음 에 if 내장 을 제거 하고 비슷 한 코드 구조 로 이 코드 의 의 도 를 더욱 명확 하고 직 설 적 으로 나타 내 려 고 합 니 다.
이 코드 는 이러한 작은 문제 가 있어 서 지속 적 으로 개선 할 수 있다.
1 이 방법 이 되 돌아 오 는 사용자 목록 크기 를 예상 할 수 있다 면 초기 목록 크기 를 설정 할 수 있 습 니 다.
2. 조회 결과 가 비어 있 으 면 null 이 아 닌 빈 목록 으로 돌아 가면 코드 가 더 치밀 할 수 있 습 니 다.
public List<User> getUserList_2(final int maxSize) {
List<User> userList = new ArrayList<User>(maxSize);
int selectSize = maxSize - userList.size();
userList.addAll(getUserListFromSource1(selectSize));
if (userList.size() >= maxSize) {
return userList;
}
selectSize = maxSize - userList.size();
userList.addAll(getUserListFromSource2(selectSize));
if (userList.size() >= maxSize) {
return userList;
}
selectSize = maxSize - userList.size();
userList.addAll(getUserListFromSource3(selectSize));
return userList;
}
이렇게 하면 많이 좋아 진 것 같다.여기 서 지 키 는 원칙 은 프로 그래 밍 언어 로 수 요 를 번역 하고 자연 언어 에 가 까 운 표현 방식 으로 수 요 를 실현 하여 두 세계 의 차 이 를 줄 이 는 것 이다.
더 좋 은 방법 은 먼저 자연 언어 (또는 위조 코드) 로 수요 의 실현 을 묘사 한 다음 에 진정한 코드 로 번역 하 는 것 이다.
자연 언어 로 이 수요 의 실현 은 다음 과 같다.
1 빈 사용자 목록 을 새로 만 듭 니 다.
2. 다음 조회 의 상한 선 을 계산한다.
3. 데이터 원본 1 에 가서 조회 합 니 다.
4. 결 과 를 사용자 목록 에 추가 합 니 다.
5. 사용자 목록 이 상한 에 도달 하면 돌아 갑 니 다.
6 다음 조회 의 상한 선 을 계산한다.
7. 데이터 원본 2 로 조회 합 니 다.
8. 결 과 를 사용자 목록 에 추가 합 니 다.
9. 사용자 목록 이 상한 에 도달 하면 돌아 갑 니 다.
10 다음 조회 의 상한 선 을 계산한다.
11. 데이터 원본 3 에 가서 조회 합 니 다.
12. 결 과 를 사용자 목록 에 추가 합 니 다.
13. 귀환.
이 실현 에 대한 묘사 와 진실 한 실현 은 매우 비슷 하 다. 설령 실현 되 지 않 았 더 라 도 이 자연 언어의 실현 을 보고 대응 하 는 코드 로 번역 하 는 것 도 쉽다.
물론 컴퓨터 프로 그래 밍 은 복잡 하 다. 이곳 의 실현 에는 잠재 적 인 문제 가 있다.코드 에 중복 되 는 구조 가 있 습 니 다.이곳 의 실현 은 이미 비교적 간단 하 다 는 것 을 감안 하여 이 중 복 된 구 조 를 더 이상 없 애 지 않 았 다.단, 변경 이 필요 하 다 면 더 많은 데이터 원본 을 조회 하거나 설정 할 수 있 는 데이터 원본 을 조회 해 야 합 니 다. 코드 는 다음 과 같이 진행 할 수 있 습 니 다.
interface UserQueryService {
List<User> queryUserList(int maxSize);
}
class UserQueryServiceImpl_1 implements UserQueryService {
@Override
public List<User> queryUserList(int maxSize) {
return getUserListFromSource1(maxSize);
}
}
class UserQueryServiceImpl_2 implements UserQueryService {
@Override
public List<User> queryUserList(int maxSize) {
return getUserListFromSource2(maxSize);
}
}
class UserQueryServiceImpl_3 implements UserQueryService {
@Override
public List<User> queryUserList(int maxSize) {
return getUserListFromSource3(maxSize);
}
}
public List<User> getUserList_3(final int maxSize) {
// userQueryServices , 。
// , 。
List<UserQueryService> userQueryServices = new ArrayList<UserQueryService>();
userQueryServices.add(new UserQueryServiceImpl_1());
userQueryServices.add(new UserQueryServiceImpl_2());
userQueryServices.add(new UserQueryServiceImpl_3());
List<User> userList = new ArrayList<User>(maxSize);
// 1
for (UserQueryService service : userQueryServices) {
int selectMaxSize = maxSize - userList.size();
userList.addAll(service.queryUserList(selectMaxSize));
if (userList.size() >= maxSize) {
break;
}
}
// 2
for (int i = 0; i < userQueryServices.size()
&& userList.size() < maxSize; i++) {
UserQueryService service = userQueryServices.get(i);
int selectMaxSize = maxSize - userList.size();
userList.addAll(service.queryUserList(selectMaxSize));
}
return userList;
}
방법 체 에 서 는 방식 1 과 방식 2 가 모두 가능 하 다.간단 한 순환 에 대해 꼬리 부분의 판단 이 여러 줄 의 조건 판단 보다 더 뚜렷 해 보인다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.