Có phải là một cách thực hành tốt để đặt tên cho biến trả về kết quả của Google không? [đóng cửa]


44

Có phải là một thực hành tốt để gọi biến là một phương thức trả về với một tên biến result?

Ví dụ:

public Zorglub calculate() {
    Zorglub result = [...]
    [...]
    return result;
}

Hay tôi nên đặt tên theo loại của nó?

public Zorglub calculate() {
    Zorglub zorglub = [...]
    [...]
    return zorglub;
}

Tôi đã nhìn thấy cả hai trong tự nhiên, nếu tôi cần chọn một lý do nào có thể khiến tôi thích cái trước hay cái sau (hoặc bất kỳ tên nào tốt hơn)?

Tôi chủ yếu nghĩ về Java.


73
Tôi cũng đã thấy ofTheJediđược sử dụng cho mục đích đó. Không phải là một đề nghị, chỉ nói rằng tôi đã nhìn thấy nó. Zorglub ofTheJedi = //...; return ofTheJedi;

7
Tôi thường gọi nó là "retval" (giá trị để trả về) nhưng đó ít nhiều giống với "kết quả", mà tôi sẽ bỏ phiếu.
Zeta Hai

5
Mỗi người có một câu trả lời khác nhau, tất cả đều giống nhau, nhưng khác nhau và hợp lệ, câu hỏi không chủ quan, nhưng câu trả lời là. Đó là một cuộc thăm dò ý kiến ​​nhiều hơn.
ZJR

16
Tôi muốn nói rằng "kết quả" là một biến là tốt, nhưng "tính toán" như một hàm thì hoàn toàn không.
Kaz Dragon

2
Bạn có làm việc với nhiều lập trình viên Delphi trước đây không?
Peter Turner

Câu trả lời:


48

Nếu đây là một biến phương thức, nó thực sự phụ thuộc vào khả năng đọc.

Xem như bạn đã có tên loại trong cả khai báo biến và kiểu trả về phương thức, bạn cũng có thể sử dụng result- đó là mô tả về vai trò của biến.


40

Đọc chéo được thực hiện dễ dàng hơn nếu biến được đặt tên result. Điều này làm cho ý định của bạn rõ ràng.


2
+1 Đây là điểm chính. Tôi biết kết quả có nghĩa là gì trong bất kỳ bối cảnh nào chỉ bằng cách liếc vào mã.
Xeoncross

1
Tôi đồng ý, sử dụng loại biến không giúp bạn hiểu rằng bạn sẽ trả lại nó. Trong các ví dụ đơn giản này, sẽ dễ dàng thấy việc quay trở lại khi cuộn hoặc tìm kiếm, nhưng sẽ nhanh hơn để biết trước giá trị trả về của hàm là gì. Nó cũng quan trọng để kích hoạt nó, như được thực hiện trong ví dụ.
nycynik

17

Nếu tôi cần một biến trả về (điều này thực sự hiếm khi xảy ra), tôi luôn gọi nó retvà luôn xác định nó ngay bên dưới đầu hàm. Hàm đã có một tên, trong đó nói tất cả về những gì nó trả về.

Nếu tôi có myFunctiontôi có thể đặt tên cho nó biến trở lại myFunctionReturnValueđể nói chính xác những điều tương tự, chỉ có tôi phải nói điều đó một cách rõ ràng mỗi lần duy nhất. Vì các chức năng thường phải ngắn, nên không cần phải có nhân chứng như vậy. Và ngay cả khi tôi mất dấu vết, tôi có thể chuyển sang khai báo và sẽ hạ cánh ngay bên dưới định nghĩa hàm.

Nhưng bất kỳ tên nào khác, không hoàn toàn (như rethoặc result) hoặc trạng thái rõ ràng (như myFunctionReturnValuehoặc myFunctionResult), rằng đây là biến trả về của hàm hiện tại quá chung chung.

Trong ví dụ thứ hai của bạn zorglublà một lựa chọn khủng khiếp. Tất cả các khai báo thực sự cho tôi biết là bạn đã tạo một biến, tên của nó bằng với chú thích loại được tìm thấy ngay bên cạnh tên. Nó hữu ích như int someInthoặc Zorglub z.

Trong ví dụ đầu tiên của bạn, khi tôi nhìn vào mã, trước tiên tôi thấy tên hàm, cho tôi biết rằng hàm này tính toán a Zorglub. Khi tôi đọc dòng thứ hai tôi thấy "ok, đây là zorglub, nó sẽ được trả lại, nhưng rõ ràng nó không thể được trả lại ngay và do đó được lưu trữ trong resultbiến" (như một lưu ý phụ: Nếu bạn là sẽ không gán lại giá trị, sau đó tốt nhất bạn nên khai báo biến cuối cùng để truyền đạt điều đó), và sau đó tôi nghĩ "vì vậy bây giờ hãy xem điều gì xảy ra với nó trước khi nó được trả về". Không giống như trong ví dụ đầu tiên, tôi không cần phải đọc thêm nữa để biết rằng đây là biến, điều đó sẽ được trả về và tôi muốn theo dõi trong thân hàm nếu tôi muốn hiểu nó.

Bạn có thể muốn đọc lên Lập trình Spartan , liên quan đến câu hỏi của bạn.


8
+1 cho "zorglub là một lựa chọn tồi tệ". Không có lý do trần tục nào để có một tên biến, trong bất kỳ bối cảnh nào, nó giống hệt với tên loại (trừ vốn ban đầu). Khai báo cho bạn biết loại biến - đặt tên biến của bạn sau loại của bạn không tốt hơn gọi các biến của bạn là x1, x2, x3, v.v. Tên của bất kỳ biến nào sẽ diễn tả biến đó dùng để làm gì hoặc nó làm gì. Tên ưa thích của tôi cho một biến trong trường hợp cụ thể này là toReturn - bởi vì biến tham chiếu đối tượng cần trả về. Trong thực tế, rất nhiều tên biến của tôi bắt đầu bằng "đến".
Dawood nói phục hồi lại

21
@DavidWallace - đó là quá mạnh mẽ tuyệt đối. Tôi có một lớp gọi là Container. Nếu tôi có một phương thức sửa đổi số lượng, tôi có thể nói var container = getContainer(id); container.Quantity += 1; Điều đó chắc chắn có thể đọc được nếu bối cảnh của phương thức chỉ hoạt động trên một container duy nhất và đó là tất cả những gì nó làm. Gọi nó theContainerWeAreGoingToAdjustTheQuantityOfchỉ là vô lý.
Scott Whitlock

4
@David, tôi không đồng ý. Hãy xem tình huống bạn có một số biến cục bộ, mỗi biến khác nhau (giả sử Người dùng, Người quản lý và Bộ phận). Và giả sử nhiệm vụ là liên kết người dùng với bộ phận và nhóm quản lý. IMHO hoàn toàn ổn khi gọi ví dụ Người dùng này một cách đơn giản user(trái ngược với userToJoinThisDepartmentAndManager? Hoặc bạn sẽ chọn gì?)
Péter Török

10
Tiểu nitlog: Tôi ghét nhìn thấy "ret" hoặc "rv" hoặc các biến thể viết tắt khác của result / returnValue. "Kết quả" không dài lắm, và không ai cần phải bảo tồn các nhân vật.
Kristopher Johnson

2
@KristopherJohnson: "kết quả" không dài lắm, nhưng cũng không có nghĩa là "giá trị trả về". Giá trị trả về không phải luôn luôn là kết quả của tính toán và ngược lại, kết quả tính toán không phải luôn luôn là giá trị trả về. Tôi cho rằng bạn có thể đặt tên cho giá trị trả về của mình returnValue, nhưng retlà truyền thống, giống như intchar.
ruakh

12

Trong ví dụ thứ hai của bạn, bạn đang kết hợp loại kết quả với nó là gì .

Zorglub zorglub;

chỉ nói với tôi đó là Zorglub, hai lần. Ba lần nếu tôi bận tâm đọc kiểu trả về. Tuy nhiên,

double variance;

ví dụ, cho tôi manh mối về ý nghĩa của giá trị trả về , về mặt ngữ nghĩa của chương trình. Nó có thể hoặc không thể rõ ràng hơn việc chỉ gọi nó result, tùy thuộc vào kích thước của phương thức - đó là một lời kêu gọi phán xét cho mỗi phương pháp IMO.


8

Nếu bạn chơi với nhiều đối tượng Zorglub trong phương pháp của bạn, bạn "có thể" làm cho một sai lầm và trả lại một sai lầm, hoặc / và bạn có thể bị cám dỗ để đặt tên cho người khác zorglub1, zorglub2vv

Nếu bạn đặt tên cho nó result, không có cơ hội cho bạn để phạm sai lầm như vậy. Thêm vào đó, tôi thấy đó là một cái tên hay; Tôi cũng đã nhìn thấy returnedValuehoặc returnedObjectnhiều lần, nó cũng rõ ràng mặc dù hơi dài.


5

Cá nhân tôi không hoàn toàn thoải mái resultkhi sử dụng như một tên biến. Đủ công bằng, nó cho tôi biết rằng giá trị liên quan là kết quả của một số tính toán - tuy nhiên, tôi đoán điều đó đúng với khoảng (hoặc hơn) 90% các biến / trường được sử dụng trong một chương trình.

Hơn nữa, như một số câu trả lời khác đã lưu ý, nó có thể được sử dụng để đánh dấu giá trị được trả về từ một phương thức / hàm. Tuy nhiên, nếu tôi giữ các phương thức của mình ngắn gọn, chỉ tập trung vào làm một việc duy nhất và duy trì ổn định ở một mức độ trừu tượng duy nhất, tôi sẽ không có nhiều biến cục bộ và sẽ rất đơn giản để xem phương thức nào sẽ trở lại.

Vì vậy, tôi thích giữ cho các phương thức của mình ngắn gọn và sạch sẽ, và đặt tên cho các biến của mình để thể hiện ý nghĩa của giá trị mà chúng giữ, hơn là vai trò cục bộ của nó bên trong phương thức kèm theo. Tuy nhiên, (ví dụ trong mã kế thừa) Zorglub resultchắc chắn có thể dễ hiểu hơn Zorglub zorglub.


12
Nó không được gọi resultvì nó là kết quả của một số tính toán; nó được gọi resultbởi vì nó là kết quả của tính toán này . Điều đó cũng hoạt động như ý nghĩa của nó IMO, ngay cả khi nó không phải là ý nghĩa cụ thể nhất có thể. Thể hiện ý nghĩa là vàng, nhưng ý địnhthành ngữ cũng có thể có giá trị. Trong trường hợp này, đó là một chút đánh đổi.
Supr

@Supr: Tên nào bạn sẽ sử dụng để mô tả kết quả của một số tính toán khác, sẽ chỉ được sử dụng trong câu hoặc hai câu tiếp theo (ví dụ if (result >= 0) numChars+=result; else break;, và ý nghĩa của nó sẽ rõ ràng từ tính toán trong câu hỏi?) nó sẽ được trả về từ hàm này sẽ được gọi ret, trong khi giá trị được trả về từ hàm được gọi cuối cùng sẽ là result. Lưu ý rằng resultcó thể có ý nghĩa hơn tên dài hơn nếu giá trị trả về của hàm có thể đại diện cho số lượng hoặc mã lỗi.
supercat

@supercat, tôi sẽ đặt tên cho nó dựa trên tính toán là gì hoặc giá trị được dự định sử dụng cho mục đích gì. Ngay cả khi nó chỉ được sử dụng trong lần tính toán tiếp theo, nó vẫn giúp dễ đọc nếu nó được đặt tên tốt. Trong ví dụ của bạn, tôi không biết ý nghĩa của resultnó là gì hoặc mã thực sự làm gì ở mức cao hơn. Tôi sẽ phải tham khảo nơi nó được đặt để xem giá trị của nó đến từ đâu và nó là gì. Một cái gì đó giống addedCharshoặc matchedCharssẽ minh bạch hơn và giúp tiết lộ những gì mã đang làm, và không yêu cầu phải tung hứng về mặt tinh thần này và những thứ liên quan result = ...:)
Supr

@Supr: Vấn đề là trong nhiều trường hợp, các phạm vi giá trị trả về khác nhau có thể có nghĩa là những thứ khác nhau. Ví dụ, một thói quen đọc gói vào bộ đệm có kích thước được chỉ định có thể trả về một số byte nếu nhận được gói hoặc số âm để chỉ ra rằng gói đang (và vẫn) đang chờ xử lý quá lớn đối với bộ đệm, hoặc một số âm thực sự lớn để chỉ ra một số lỗi khác. Lưu trữ lợi nhuận vào resultvà sau đó kiểm tra nó theo các tiêu chí đó có vẻ tự nhiên hơn là cố gắng đưa ra một tên mô tả bao gồm tất cả chúng.
supercat

@supercat, Sử dụng retthay vì resultcó vẻ tốt của tôi. Theo ý kiến ​​của tôi thì nó hơi kém một chút vì nó được viết tắt và không giống như danh từ, nhưng nếu nó được sử dụng một cách nhất quán thì nó tương đương với result.
Supr

1

Cá nhân tôi sử dụng tên resultcho giá trị được trả về từ hàm / phương thức. Nó làm cho nó rõ ràng rằng nó là giá trị được trả lại. Đặt tên theo loại có vẻ không hữu ích, vì có thể có nhiều hơn một biến cùng loại.


Uhm, chắc chắn thực tế là nó sẽ nói 'trở lại' trước khi nó trở lại là đủ rõ ràng? Bạn nên mô tả những gì bạn sẽ làm với nó, bây giờ là 'làm thế nào'. Tại sao không gọi nó là tổng số, kết quả hoặc một cái gì đó mô tả mục đích, sau đó mã của bạn sẽ sẵn sàng "trả lại tổng số" hoặc tương tự ...
Dave

@Dave Không nhất thiết, đặc biệt là nếu bạn có một vài đối tượng cùng loại mà tất cả đều được trả lại, mục đích của phương pháp là tìm ra đâu là đối tượng thích hợp để trả về.
Andy

@Andy Tôi thấy quan điểm của bạn, nhưng trong thực tế, tôi không thể tưởng tượng việc viết một chức năng như thế. Nếu đó là lý do để viết một chức năng như vậy, có vẻ như nó nên được chia thành các chức năng nhỏ dễ hiểu hơn.
Dave

1

Có gì khác biệt? Chỉ có 2 từ khác nhau ở đó sẽ làm điều tương tự, vì vậy vấn đề thực sự là cái nào nghe rõ hơn với bạn?

"Kết quả" hoặc "zorglub".

Tôi muốn sử dụng ZorglubResultcho một bộ khởi động để thấy rằng kết quả trả về từ Zorglub dễ dàng hơn để so sánh với các kết quả khác mà bạn có thể có và kết quả như bạn có thể thấy ..


1

Tôi nên đặt tên theo loại của nó?

Không bao giờ. Đây được gọi là Hệ thống Hungary và bị lỗi thời bởi ý tưởng sử dụng một chương trình có thể hiển thị loại của bất kỳ biến nào bất cứ khi nào bạn cần.


1

Bất cứ khi nào bạn cần đặt tên bất cứ điều gì trong mã, bạn nên cung cấp các tên mô tả, có ý nghĩa và có thể đọc được. Trường hợp của biến trả về là một ví dụ đặc biệt tốt về nơi mọi người có xu hướng trở nên tự mãn về việc đặt tên.

Nếu bạn có một hàm được đặt tên rõ ràng và bạn chỉ cần một dòng mã duy nhất, thì bạn có thể bỏ qua việc đặt tên hoàn toàn. Làm cho phương pháp của bạn ngắn và mục đích duy nhất luôn là lý tưởng mà bạn nên hướng tới. Tuy nhiên, đó là trường hợp đôi khi bạn cần phải hoàn thành một chức năng với một vài dòng mã. Tôi luôn luôn nên đặt tên cho biến của mình để phù hợp với mục đích của hàm.

Nếu mục đích của hàm là trả về kết quả của phép tính hoặc thuật toán quyết định, thì đó resultlà một tên hoàn toàn phù hợp cho biến của bạn để sử dụng, nhưng nếu hàm của bạn trả về một mục từ danh sách thì sao? Điều gì xảy ra nếu chức năng của bạn đang phục vụ một số mục đích khác không liên quan đến toán học hoặc danh sách? Trong những trường hợp đó, tốt hơn là cung cấp biến với một tên có ý nghĩa liên quan đến lý do tại sao hàm được tạo. Chắc chắn, bạn chỉ có thể sử dụng kết quả nếu bạn muốn bởi vì đó là một cái tên không có khả năng xung đột với bất cứ điều gì khác, tuy nhiên từ góc độ dễ đọc, việc đặt tên cho biến của bạn có ý nghĩa hơn và theo ngữ cảnh sẽ có ý nghĩa hơn.


0

Tôi thích kết hợp chúng, cho thấy nó là gì và nó dự định sẽ được trả lại.

vì vậy trong ví dụ của bạn, nó sẽ là resultZorglub

nếu những gì nó không thực sự quan trọng hơn nó sẽ chỉ là kết quả (không phải resultString)


Không tệ nhưng tôi đoán bạn sẽ phải đổi tên biến của mình nếu kiểu trả về thay đổi. Với IDE hiện đại, tôi đoán nó được thực hiện trong một hoặc hai lần nhấp.
Jalayn

@Jalayn Có, nhưng nếu loại này không được đặt tên thì đó là một thay đổi hoàn toàn không phải thực hiện. (Nếu một phương thức đủ dài mà một tên đơn giản không rõ ràng, có lẽ nó quá dài và nên được tái cấu trúc.)
Donal Fellows

@DonalFellows Tôi hoàn toàn đồng ý với bạn. Càng ít thay đổi bạn thấy khi cập nhật từ kho lưu trữ nguồn thì càng tốt.
Jalayn

Được rồi đồng ý rằng khi bạn thay đổi loại trả về, bạn có thể quên thay đổi nó trong tên biến, đó là một vấn đề. Cho đến bây giờ nó chưa bao giờ là một vấn đề đối với tôi. Tôi vẫn thích hiển thị ý định kép trong tên nhưng với mã mục đích nhỏ hơn đã hiển thị tốt, nó cũng có thể là quá mức cần thiết. Các bạn đã thuyết phục tôi. Nếu tôi cảm thấy cần phải gọi các biến của mình theo cách này kể từ bây giờ, tôi sẽ cấu trúc lại cho đến khi tôi không cảm thấy cần thiết nữa. Cảm ơn
KeesDijk

0

Tôi không thấy nhiều sự khác biệt giữa việc đặt giá trị trả về tại một số điểm và sau đó sử dụng các điều kiện để bỏ qua tất cả các mã có thể sửa đổi nó và returnngay lập tức, vì vậy tôi đi trả lại trực tiếp, do đó không có resultbiến.

Nếu bạn có một giá trị trung gian có thể hoặc không thể thay đổi bởi mã có điều kiện, thì đó không phải là kết quả (chưa), vì vậy chắc chắn không nên đặt tên như vậy.


0

Khi tôi đang làm việc trong C ++ và tôi đoán điều này có thể áp dụng trong Java tôi đã làm.

ví dụ

int Width() const
{
    Requires(....);
    Requires(....);

    //calculation

    Ensures(...);
    Ensures(...);
    return Result;
}

Đây là thiết kế theo hợp đồng, vì khối đảm bảo phải ở cuối phương thức. Nhưng sự trở lại phải là cuối cùng. Chúng tôi có quy tắc trả về Kết quả là điều duy nhất có thể tuân theo khối đảm bảo.


0

Trong một hàm đệ quy, thường có hiệu quả để mang kết quả từ bước này sang bước khác, để thực hiện tối ưu hóa cuộc gọi đuôi. Để báo hiệu cho người dùng, rằng anh ta không cần cung cấp một tham số, có thể hợp lý khi đặt tên cho một tham số là "kết quả":

def removeOccurence [A] (slice: Seq[A], original: Seq[A]) = {
  @scala.annotation.tailrec
  def remove (leftOriginal: Seq[A], result: Seq[A]) : Seq[A] =
    trimStart (slice, leftOriginal) match {
      case (h :: tail) => remove (tail, h +: result)
      case (Nil)       => result.reverse
    }
    remove (original, Nil)
}

Nhưng thường xuyên hơn, tôi sử dụng 'carry' và 'sofar', thứ mà tôi đã thấy trong tự nhiên, và nó mang ý tưởng thậm chí tốt hơn một chút, trong hầu hết các trường hợp.

Tất nhiên, lý do thứ hai là, nếu chủ đề của bạn đề xuất từ ​​'' kết quả '', ví dụ nếu bạn thực hiện đánh giá số học. Bạn có thể phân tích công thức, thay thế các biến bằng các giá trị và tính kết quả cuối cùng.

Một lý do thứ ba đã được nêu, nhưng tôi có một sai lệch nhỏ: Bạn viết một phương thức thực hiện một số công việc, giả sử nó đánh giá một dạng '' tối đa ''.

def max = {
  val result = somethingElseToDo
  if (foo) result else default 
}

Thay vì gọi kết quả là '' kết quả '', chúng ta có thể gọi nó là '' max '', nhưng trong một số ngôn ngữ, bạn có thể bỏ qua dấu ngoặc đơn khi gọi một phương thức, do đó max sẽ là một cuộc gọi đệ quy cho chính phương thức đó.

Nói chung, tôi thích một cái tên cho biết, kết quả là gì. Nhưng nếu tên đó đã được sử dụng, có thể bởi nhiều hơn một biến, thuộc tính hoặc phương thức, bởi vì có trường GUI, biểu diễn chuỗi, số và một cho cơ sở dữ liệu, sử dụng một biến khác làm tăng xác suất nhầm lẫn. Trong các phương pháp ngắn từ 3 đến 7 dòng, '' kết quả '' không phải là vấn đề đối với tên.


0

Trong Object Pascal, đây không phải là sự lựa chọn. Bạn phải gán giá trị cho Resultbiến ở đâu đó trong mã của hàm.

Thí dụ:

function AddIntegers( A,B: Integer): Integer;
begin
  Result := A + B; 
end; 

Vì vậy, đối với tôi khá tự nhiên có một biến "Kết quả" (hoặc "Retorno", vì tôi đánh vần nó bằng tiếng Bồ Đào Nha để tránh xung đột tên với các từ dành riêng của ngôn ngữ) để nhận giá trị trả về.

Của couse, nếu đó là một biểu thức rất đơn giản trong ngôn ngữ có nguồn gốc C, tôi sẽ không bận tâm khai báo một biến kết quả - trả lại biểu thức trực tiếp.


0

nó không chỉ là những gì bạn đặt tên cho kết quả (tôi đặc biệt là 'r'), mà còn là cách nó được sử dụng. chẳng hạn, nếu bạn sắp có biến trả về, thì mọi câu lệnh return sẽ trả về nó. không có 'return r;' ở cuối, nhưng rắc những thứ như 'return m * x + b; "trong suốt phương thức / hàm. sử dụng" r = m * x + b; trả lại r; "thay vào đó.


-1

kết quả tốt Tôi có thể hiểu mã trong cái nhìn đầu tiên để tên biến phục vụ mục đích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.