นี่เป็นคำถามเก่า แต่ฉันจะโพสต์ที่นี่ต่อไป ฉันมีเวลา 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());
}
ตอนนี้ให้เวลาตัวคุณเองและดูรหัส (สกัดจาก ElasticsearchTemplate จากโครงการ spring-data-elasticsearch - รหัสที่ฉันกำลังตรวจสอบซึ่งทำให้ฉันค้นหาใน Google สำหรับสิ่งที่ผู้คนพูดถึงการตั้งชื่อการประชุม)
- มีอะไร SCODE ของ
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());
}
สมบูรณ์แบบหรือไม่ ฉันไม่คิดอย่างนั้น แต่ข้างต้นเท่าที่ตัวแปรเกี่ยวข้องตอนนี้อ่านง่ายขึ้น มีสิ่งอื่น ๆ เช่นการจัดตำแหน่งและการเว้นวรรคซึ่งฉันจะไม่ได้รับในคำตอบนี้เนื่องจากมันไม่เกี่ยวข้องกับคำถามซึ่งจะทำให้อ่านง่ายขึ้นเช่นกัน
คุณไม่ชอบ Camel Case ใช่ไหม ใช้ได้ใช้ขีดล่าง ฯลฯ แต่นำหน้าตัวแปรโลคัลและพารามิเตอร์ของคุณเพื่อทำให้แตกต่างจากตัวแปรอินสแตนซ์ของคลาส
คุณไม่ชอบa
และmy
- สบายดีอยู่ในโครงการของคุณและใช้อย่างอื่น ... แต่ใช้บางอย่าง
กฎ # 1: ความสอดคล้องภายในโครงการ
กฎ # 2:ทำให้ง่ายต่อการอ่านและไม่ต้องการให้ผู้อ่านรู้ทุกอย่างก่อนที่เขาจะสามารถเรียนรู้ได้