실천 중의 재 구성 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 가 모두 가능 하 다.간단 한 순환 에 대해 꼬리 부분의 판단 이 여러 줄 의 조건 판단 보다 더 뚜렷 해 보인다.

좋은 웹페이지 즐겨찾기