이것은 오래된 질문이지만 어쨌든 여기에 게시 할 것입니다. 나는 약 20 년 이상의 프로그래밍과 다른 사람들의 코드를 다루고 있습니다.
범위에 대한 짧은 표시로 변수 이름을 지정하면 실제로 코드를 볼 다음 사람 (또는 자신)에게 유용하다고 생각합니다.
하나는 이미 예쁜 색상의 IDE에서 코드를 보지 못합니다 (색상의 의미와 다른 IDE가 다른 색상을 표시하는 것을 기억하지 못합니다).
사실, 메소드는 너무 짧아서 수많은 변수와 수많은 코드가로드되지 않지만 짧은 코드조차도로드되지 않습니다-완전히 익숙하지 않은 코드를 볼 때 때로는 변수가 클래스 변수인지 로컬인지 알기가 어렵습니다. 변수 또는 메소드 매개 변수.
한 눈에 구별 할 수 있으면 익숙하지 않은 코드를 매우 쉽게 검토 할 수 있습니다.
이 예제를 보자 :
public <T> Page<T> moreLikeThis(MoreLikeThisQuery query, Class<T> clazz) {
int startRecord = 0;
ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz);
String indexName = isNotBlank(query.getIndexName()) ? query.getIndexName() : persistentEntity.getIndexName();
String type = isNotBlank(query.getType()) ? query.getType() : persistentEntity.getIndexType();
Assert.notNull(indexName, "No 'indexName' defined for MoreLikeThisQuery");
Assert.notNull(type, "No 'type' defined for MoreLikeThisQuery");
Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery");
MoreLikeThisRequestBuilder requestBuilder = client.prepareMoreLikeThis(indexName, type, query.getId());
if (query.getPageable() != null) {
startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize();
requestBuilder.setSearchSize(query.getPageable().getPageSize());
}
requestBuilder.setSearchFrom(startRecord);
if (isNotEmpty(query.getSearchIndices())) {
requestBuilder.setSearchIndices(toArray(query.getSearchIndices()));
}
if (isNotEmpty(query.getSearchTypes())) {
requestBuilder.setSearchTypes(toArray(query.getSearchTypes()));
}
if (isNotEmpty(query.getFields())) {
requestBuilder.setField(toArray(query.getFields()));
}
if (isNotBlank(query.getRouting())) {
requestBuilder.setRouting(query.getRouting());
}
if (query.getPercentTermsToMatch() != null) {
requestBuilder.setPercentTermsToMatch(query.getPercentTermsToMatch());
}
if (query.getMinTermFreq() != null) {
requestBuilder.setMinTermFreq(query.getMinTermFreq());
}
if (query.getMaxQueryTerms() != null) {
requestBuilder.maxQueryTerms(query.getMaxQueryTerms());
}
if (isNotEmpty(query.getStopWords())) {
requestBuilder.setStopWords(toArray(query.getStopWords()));
}
if (query.getMinDocFreq() != null) {
requestBuilder.setMinDocFreq(query.getMinDocFreq());
}
if (query.getMaxDocFreq() != null) {
requestBuilder.setMaxDocFreq(query.getMaxDocFreq());
}
if (query.getMinWordLen() != null) {
requestBuilder.setMinWordLen(query.getMinWordLen());
}
if (query.getMaxWordLen() != null) {
requestBuilder.setMaxWordLen(query.getMaxWordLen());
}
if (query.getBoostTerms() != null) {
requestBuilder.setBoostTerms(query.getBoostTerms());
}
SearchResponse response = requestBuilder.execute().actionGet();
return resultsMapper.mapResults(response, clazz, query.getPageable());
}
이제 스스로 시간을내어 코드를 살펴보십시오 (Spring-Data-elasticsearch 프로젝트에서 추출한 ElasticsearchTemplate에서 추출한 코드-사람들이 명명 규칙에 대해 말하는 내용을 Google에서 검색하도록 유도 한 코드입니다).
- 의 코드는 무엇입니까
resultsMapper
?
- 가
requestBuilding
매개 변수는?
- 기타...
변수 이름을 지정하는 방법에 대한 간단한 제안은 다음과 같습니다.
- 클래스 정적 속성 (예 : 상수) : ALL_CAPS_WITH_UNDERSCORES (예 :)
HOST_NAME
.
- 클래스 속성 (예 : 클래스 인스턴스 변수) : camelCase (예 :)
resultsMapper
.
- 메소드 파라미터 : 접두사
a
(예를 들어 aQuery
, aClazz
).
- 지역 변수 : 접두사
my
(예를 들어 myIndexName
, myType
).
위의 코드는 다음과 같습니다.
public <T> Page<T> moreLikeThis(MoreLikeThisQuery aQuery, Class<T> aClazz) {
int myStartRecord = 0;
ElasticsearchPersistentEntity myPersistentEntity = getPersistentEntityFor(aClazz);
String myIndexName = isNotBlank(aQuery.getIndexName()) ? aQuery.getIndexName() : myPersistentEntity.getIndexName();
String myType = isNotBlank(aQuery.getType()) ? aQuery.getType() : myPersistentEntity.getIndexType();
Assert.notNull(myIndexName, "No 'indexName' defined for MoreLikeThisQuery");
Assert.notNull(myType, "No 'type' defined for MoreLikeThisQuery");
Assert.notNull(aQuery.getId(), "No document id defined for MoreLikeThisQuery");
MoreLikeThisRequestBuilder myRequestBuilder = client.prepareMoreLikeThis(myIndexName, myType, aQuery.getId());
if (aQuery.getPageable() != null) {
myStartRecord = aQuery.getPageable().getPageNumber() * aQuery.getPageable().getPageSize();
myRequestBuilder.setSearchSize(aQuery.getPageable().getPageSize());
}
myRequestBuilder.setSearchFrom(myStartRecord);
if (isNotEmpty(aQuery.getSearchIndices())) {
myRequestBuilder.setSearchIndices(toArray(aQuery.getSearchIndices()));
}
if (isNotEmpty(aQuery.getSearchTypes())) {
myRequestBuilder.setSearchTypes(toArray(aQuery.getSearchTypes()));
}
if (isNotEmpty(aQuery.getFields())) {
myRequestBuilder.setField(toArray(aQuery.getFields()));
}
if (isNotBlank(aQuery.getRouting())) {
myRequestBuilder.setRouting(aQuery.getRouting());
}
if (aQuery.getPercentTermsToMatch() != null) {
myRequestBuilder.setPercentTermsToMatch(aQuery.getPercentTermsToMatch());
}
if (aQuery.getMinTermFreq() != null) {
myRequestBuilder.setMinTermFreq(aQuery.getMinTermFreq());
}
if (aQuery.getMaxQueryTerms() != null) {
myRequestBuilder.maxQueryTerms(aQuery.getMaxQueryTerms());
}
if (isNotEmpty(aQuery.getStopWords())) {
myRequestBuilder.setStopWords(toArray(aQuery.getStopWords()));
}
if (aQuery.getMinDocFreq() != null) {
myRequestBuilder.setMinDocFreq(aQuery.getMinDocFreq());
}
if (aQuery.getMaxDocFreq() != null) {
myRequestBuilder.setMaxDocFreq(aQuery.getMaxDocFreq());
}
if (aQuery.getMinWordLen() != null) {
myRequestBuilder.setMinWordLen(aQuery.getMinWordLen());
}
if (aQuery.getMaxWordLen() != null) {
myRequestBuilder.setMaxWordLen(aQuery.getMaxWordLen());
}
if (aQuery.getBoostTerms() != null) {
myRequestBuilder.setBoostTerms(aQuery.getBoostTerms());
}
SearchResponse myResponse = myRequestBuilder.execute().actionGet();
return resultsMapper.mapResults(myResponse, aClazz, aQuery.getPageable());
}
완벽합니까? 나는 그렇게 생각하지 않습니다. 그러나 변수에 관한 한, 위의 내용을보다 쉽게 읽을 수 있습니다. 정렬 및 간격과 같은 다른 것들이 있는데, 질문과 관련이 없기 때문에이 답변에 들어 가지 않을 것이므로 읽기가 더 쉽습니다.
낙타 케이스가 마음에 들지 않습니까? 밑줄 등을 사용하되, 로컬 변수와 매개 변수를 접두사로 사용하여 클래스 인스턴스 변수와 다르게 만듭니다.
당신은 싫어 a
하고 my
단지 다른 프로젝트에 사용 뭔가 내에서 일관성을 유지, 잘 ...하지만 사용 무언가를 -.
규칙 # 1 : 프로젝트 내 일관성.
규칙 # 2 : 읽기 쉽게하고 독자가 배우기 전에 모든 것을 알 필요는 없습니다.