Đây là một câu hỏi cũ, nhưng dù sao tôi cũng sẽ đăng ở đây. Tôi có hơn 20 năm lập trình và giao dịch với mã của người khác.
Tôi nghĩ rằng việc đặt tên biến của bạn với một dấu hiệu ngắn về phạm vi của chúng thực sự hữu ích cho người tiếp theo (hoặc chính bạn), người sẽ xem mã của bạn.
Người ta chưa xem mã trong một IDE có màu sắc đẹp (và tôi không thể nhớ màu sắc có nghĩa là gì và IDE khác nhau hiển thị các màu khác nhau, v.v.).
Đúng, các phương thức phải đủ ngắn để nó không được tải với hàng tấn biến và tấn mã mà ngay cả khi ngắn - khi bạn nhìn vào mã hoàn toàn xa lạ, đôi khi rất khó để biết liệu một biến có phải là biến lớp hay không, cục bộ tham số biến hoặc phương thức.
Để có thể phân biệt trong nháy mắt làm cho nó rất dễ dàng để xem lại mã mà bạn không quen thuộc.
Lấy ví dụ này:
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());
}
Bây giờ, hãy dành thời gian cho chính mình và xem mã (được trích xuất từ ElSTERearchTemplate từ dự án nghiên cứu dữ liệu mùa xuân - mã mà tôi đang xem xét khiến tôi tìm kiếm trên Google về những gì mọi người nói về quy ước đặt tên).
- Cái gì của cái
resultsMapper
gì?
- Là
requestBuilding
một tham số?
- Vân vân...
Đây là gợi ý đơn giản của tôi về cách đặt tên biến:
- Các thuộc tính tĩnh của lớp (tức là hằng số): ALL_CAPS_WITH_UNDERSCORES (ví dụ:
HOST_NAME
).
- Các thuộc tính lớp (tức là các biến thể hiện của lớp): camelCase (vd
resultsMapper
).
- Thông số phương pháp: bắt đầu bằng
a
(ví dụ aQuery
, aClazz
).
- Biến cục bộ: bắt đầu bằng
my
(ví dụ myIndexName
, myType
).
Đoạn mã trên trở thành:
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());
}
Điều đó có hoàn hảo không? Tôi không nghĩ vậy. Nhưng ở trên, khi có liên quan đến các biến, bây giờ dễ đọc hơn. Có những thứ khác như căn chỉnh và khoảng cách, mà tôi sẽ không nhận được trong câu trả lời này vì nó không liên quan đến câu hỏi, điều này cũng sẽ giúp bạn dễ đọc hơn.
Bạn không thích Camel Case? Tốt thôi, hãy sử dụng dấu gạch dưới, v.v., nhưng tiền tố các biến cục bộ và các tham số của bạn để làm cho chúng khác với các biến thể hiện của lớp.
Bạn không thích a
vàmy
- tốt thôi, hãy kiên định trong dự án của bạn và sử dụng thứ khác ... nhưng hãy sử dụng thứ gì đó.
Quy tắc số 1: tính nhất quán trong dự án.
Quy tắc số 2: làm cho nó dễ đọc và không yêu cầu người đọc biết mọi thứ trước khi anh ta có thể học.