Bu eski bir soru, ama yine de buraya göndereceğim. 20 yıldan fazla bir süredir programlama ve başkalarının kodlarıyla ilgilenmem gerekiyor.
Değişkeninizi kapsamlarına göre kısa bir gösterimle adlandırmanın, kodunuza bakacak bir sonraki kişi (veya kendiniz) için gerçekten yararlı olduğunu düşünüyorum.
Bir zaten IDE güzel renkler ile kod bakmıyor (ve renklerin ne anlama geldiğini hatırlayamıyorum ve farklı IDE farklı renkler, vb gösterir).
Doğru, yöntemler yeterince kısa olmalı, bu yüzden tonlarca değişken ve ton kodla yüklü değil, kısa kodda bile - tamamen tanıdık olmayan koda baktığınızda, bir değişkenin sınıf değişkeni olup olmadığını söylemek zor olabilir, yerel değişken veya yöntem parametresi.
Bir bakışta ayırt edebilmek, bilmediğiniz kodu incelemeyi çok kolaylaştırır.
Bu örneği ele alalım:
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());
}
Şimdi, kendinize zaman ayırın ve koda bakın (ElasticsearchTemplate'ten spring-data-elasticsearch projesinden çıkarıldı - gözden geçirdiğim kod, insanların Google’da adlandırma kuralları hakkında söylediklerini aramamı istedi.
- Sonuç ne
resultsMapper
?
- Mı
requestBuilding
bir parametre?
- vb...
Değişkenlerin nasıl adlandırılması gerektiğine dair basit önerim:
- Sınıf statik öznitelikleri (yani sabitler): ALL_CAPS_WITH_UNDERSCORES (örn.
HOST_NAME
).
- Sınıf nitelikleri (yani, sınıf örneği değişkenleri): camelCase (örn.
resultsMapper
).
- Yöntem parametreleri: öneki
a
(örneğin aQuery
, aClazz
).
- Yerel değişkenler: öneki
my
(örneğin myIndexName
, myType
).
Yukarıdaki kod:
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());
}
Mükemmel mi? Ben öyle düşünmüyorum. Ancak, değişkenler söz konusu olduğunda, yukarıdakilerin okunması artık daha kolay. Soruyla ilgili olmadığı için bu cevapta girmeyeceğim hizalama ve boşluk gibi başka şeyler de var, bu da okumayı kolaylaştıracak.
Camel Case'i sevmiyor musun? İnce, alt çizgi vb. Kullanın, ancak bunları sınıf örneği değişkenlerinden farklı kılmak için yerel değişkenlerinize ve parametrelerinize ön ek uygulayın.
Sevmiyorsunuz a
ve my
- iyi, sadece projenizde tutarlı kalın ve başka bir şey kullanın ... ama bir şey kullanın.
Kural # 1: Proje içindeki tutarlılık.
Kural # 2: Okumayı kolaylaştırın ve okuyucunun öğrenmeden önce her şeyi bilmesini gerektirmez.