Các hàm 'toán học' có nên tuân theo ký hiệu toán học không?


11

Tôi cho rằng câu hỏi này sẽ được đánh dấu ngay lập tức là chủ quan, nhưng bạn nghĩ cái nào tốt hơn:

double volume(double pressure, double n_moles, double temperature) {
  return n_moles * BOLTZMANN_CONSTANT * temperature / pressure;
}

hoặc là

double volume(double P, double n, double T) {
  return n*R*T/P;
}

Nói cách khác, các hàm thực hiện một số phương trình có tuân theo ký hiệu của phương trình đó hay chúng nên sử dụng nhiều tên dài dòng hơn?


3
Đôi khi bạn cũng dành nhiều thời gian suy nghĩ về cách đặt tên một biến hơn là bạn dành cho chính mã hóa? ;-)
Tomas

1
Tôi nghĩ rằng sự thay thế thứ hai là OK. Tôi sẽ giải thích các biến trong một bình luận mặc dù.
Giorgio

Có vẻ như ai đó thấy phù hợp để đi qua và bỏ phiếu cho câu trả lời của mọi người. Người này có quan tâm để chia sẻ lý do của mình để làm như vậy? Các câu trả lời dường như hoàn toàn hợp lý với tôi.

Về mặt kỹ thuật, điều này không liên quan gì đến ký hiệu 'toán học' và mọi thứ liên quan đến những gì một nhà vật lý sẽ nghĩ. Không có gì nhiều hơn số học đang diễn ra ở đây.
duffymo

2
Tôi có thể thấy tất cả người Mỹ vượt qua nhiệt độ ở Fahrenheit. Tôi chắc chắn sẽ không sử dụng gấp đôi như loại nhiệt độ. Có lẽ cùng đi cho áp lực. Tôi nghĩ rằng tôi sẽ quan tâm đến việc bảo mật các loại hơn là tên.
Martin York

Câu trả lời:


14

Phụ thuộc vào người đang đọc nó. Nếu bạn có thể đảm bảo rằng mãi mãi, lập trình viên tiếp theo đọc mã của bạn cũng quen thuộc với nhiệt động lực học, thì có, hãy chọn phiên bản rút gọn.

Phong cách cá nhân của tôi là sử dụng các biến như vậy (có chữ viết tắt thường được biết đến trong lĩnh vực này), nhưng bao gồm mô tả của chúng trong các bình luận.

/* P : Pressure
   V : Volume
   n : Number of moles
   R : Boltzmann constant
   T : Temperature (in K)
*/
double compute_V(double P, double n, double T) {
  return n*R*T/P;
}

5
Vấn đề ở đây là gì? Một số người không tìm hiểu về nhiệt động lực học không có cơ hội duy trì thành công mã cho dù tên biến là gì.
dsimcha

Điều này chắc chắn tốt hơn là không bao gồm thông tin, nhưng tại thời điểm này, có vẻ như sẽ dễ dàng hơn nếu chỉ sử dụng các tên đó trong hàm. Tôi không thấy nhiều tiện ích trong việc sử dụng các chữ cái ...
Patrick87

@dsmicha: Có, PV = nRT là một ví dụ rất cơ bản. Trong thế giới thực, các chức năng phức tạp hơn tồn tại thường không được biết đến và có xu hướng dài và phức tạp. Vì vậy, ngay cả khi người đó được đào tạo trong lĩnh vực này, vẫn có cơ hội tốt anh ta sẽ bắt gặp một chức năng hoàn toàn xa lạ.

4
@ Patrick87: Tôi thích các chữ cái hơn vì tôi có thể nhanh chóng kiểm tra tính chính xác của biểu thức bằng cách xem tờ giấy từ (hoặc từ bộ nhớ) vì nó gần với mẫu gốc hơn nhiều.

2
+1. Đây là cách tốt nhất để làm điều đó. Ngay cả các phương trình vật lý khá cơ bản cũng có thể sử dụng các chữ cái Hy Lạp, gốc, đạo hàm riêng, toán tử (Laplace, Hamilton), vectơ, tenxơ, v.v ... để nói chung không thể biểu diễn phương trình một cách rõ ràng trong các nhận xét. Bám vào như tiêu chuẩn-như-có thể tên biến / chữ viết tắt (ví dụ như GAS_CONSTANTkhông một tên biến tiêu chuẩn; mọi sách giáo khoa tôi biết sử dụng Rcho điều đó) và giải thích cho họ một thời gian ngắn trong ý kiến là điều tốt nhất có thể được thực hiện.
Joonas Pulakka

7

Chỉ cần ném nó ra khỏi đó, bạn có một lựa chọn khác:

Volume ComputeVolume(Pressure p, Moles m, Temperature t) { ... }

Điều này hơi giống với những gì F # làm với các đơn vị đo lường và có lợi ích là tránh các vấn đề như thay thế áp suất vô tình bằng nhiệt độ. Thật khó để nhận ra những tranh luận nên đi đâu khi chữ ký giống như thế nào (gấp đôi, gấp đôi, gấp đôi)


Chỉ cần làm rõ, có những ngôn ngữ ngoài kia có thể thực hiện phân tích thứ nguyên đó không? Tức là biết rằng sản phẩm giữa Áp suất và Âm lượng có thể được gán cho một đơn vị Năng lượng?
lindelof

Có, F # thực hiện điều này, với Đơn vị đo. msdn.microsoft.com/en-us/l Library / dd233243.aspx
Mathias

Ngay cả khi không hỗ trợ chuyển đổi tự động giữa các đơn vị, có thể có ích khi xác định loại dành riêng cho các đơn vị nhất định, như lớp Tiền. Nó hạn chế các lỗi chuyển đổi và chuyển đổi vô ý và giúp tái cấu trúc.
Mathias

Điều này có thể được thực hiện rất mạnh mẽ với các mẫu C ++.
kevin cline

@lindelof: Bạn có thể đạt được một số chức năng này với C ++typedef
Jacob

7

Tôi thích điều này:

/* This function calculates volume using the following formula:
 *
 *     n * R * T
 * v = ---------
 *         P
 */
double volume(double pressure, double n_moles, double temperature) {
    return n_moles * BOLTZMANN_CONSTANT * temperature / pressure;
}

Nói cách khác, giải thích ý nghĩa của mã trong nhận xét bằng tiếng Anh (và toán học; đó là nhận xét, bạn có thể mở rộng nó nhiều nhất có thể), nhưng sử dụng tên biến mô tả để bất kỳ ai đọc mã duy nhất vẫn có thể hiểu nó dễ dàng - đặc biệt là với các chức năng lớn hơn. Một lý do khác khiến tôi sử dụng các từ thực sự làm tên biến là giao diện rõ ràng hơn nhiều nếu bạn cần sao chép khai báo hàm vào tệp tiêu đề.


2
Ngoài ra, sẽ rất hay trong bình luận để bao gồm một liên kết đến một nơi nào đó trên internet nói về công thức (ví dụ: en.wikipedia.org/wiki/Ideal_gas_law ).
Chris Shaffer

Đây là một cách tiếp cận rất hay, nhưng hơi lộn xộn. Tôi có thể chỉ muốn xem một liên kết đến ví dụ Wikipedia mô tả (trong trường hợp này) là luật khí lý tưởng.
Patrick87

3

IMHO luôn luôn tốt hơn để sử dụng ký hiệu đã thiết lập của miền có vấn đề mà bạn đang làm việc nếu chức năng này rất đặc trưng cho miền. Dù sao đi nữa, ai đó không hiểu miền vấn đề sẽ không có cơ hội duy trì thành công mã của bạn và đối với người quen thuộc với tên miền, các tên dài sẽ gây ồn ào, cũng như gõ nhiều hơn cho bạn.

OTHO, tôi sẽ nói rằng tôi muốn ký hiệu toán học thông thường đôi khi dài dòng và mô tả hơn, nhưng bất kể tôi nghĩ mã toán học nên tuân theo quy ước toán học.

Chỉnh sửa: Câu trả lời này chỉ áp dụng nếu có một quy ước rất mạnh về ký hiệu khi viết công thức toán học. Nếu không có, và bạn phải giải thích những gì các biến thể hiện trong một nhận xét ngay cả khi cho rằng người đọc đã quen thuộc với tên miền, thì tốt nhất là bạn nên nhầm lẫn về một quy ước mô tả hơn.


2

Ý kiến ​​thuần túy, nhưng luôn luôn sử dụng các từ trên các ký hiệu một chữ cái. Nếu bạn sử dụng từ ngữ, mọi người sẽ hiểu; nếu bạn sử dụng các ký hiệu, chỉ các chuyên gia về vấn đề được đảm bảo tuân theo. Thậm chí sau đó, một số người sử dụng các ký hiệu khác nhau cho cùng một đại lượng vật lý. Bạn không có gì để mất bằng cách sử dụng tên dài hơn.


2

Mối quan tâm của bạn phải rõ ràng sau đó là tính chính xác (không chính xác nhưng mã rõ ràng dễ dàng được sửa) do đó chức năng của bạn nên được viết để duy trì bởi một lập trình viên chung càng xa càng tốt. Các chú thích tiêu đề hàm sẽ giải thích công thức và cách sử dụng và mô tả các tham số vào / ra. Sau đó, cơ thể chức năng được bố trí như thế nào không quan trọng quá miễn là nó phù hợp với các bình luận tiêu đề.

(Tôi biết đây không phải là một cuộc thảo luận nhưng - sở thích cá nhân của tôi sẽ là đặt tên rõ ràng cho các biến thể mặc dù trong trường hợp này, một lớp lót có thể là một chức năng 'thuần túy'; một cuộc gọi có cùng tham số sẽ mang lại kết quả tương tự kết quả luôn luôn để không có sự phức tạp liên quan đến nhà nước yêu cầu giải thích)

  • Các ngôn ngữ khác hỗ trợ phân tích thứ nguyên, điều này có thể được thực hiện, ví dụ như trong C ++ với các mẫu, thư viện Boost Đơn vị sử dụng phương pháp này tôi tin.

1

Phụ thuộc vào mức độ "cách xa" của lớp nghiệp vụ ... Mã trở lại trong ngăn xếp mã, càng nhắm mục tiêu vào hàm toán học trừu tượng, tôi càng cố gắng mô phỏng cái được chấp nhận chung ký hiệu giao phối và quy ước đặt tên .. Càng gần mặt trước hoặc tầng kinh doanh, tôi càng tuân thủ các quy ước được thiết lập trong miền vấn đề.


1

Tôi thích nghĩ về nó theo cách này - Các nhà toán học đã hiểu sai với các biến ngắn và các nhà vật lý theo sau. Tại sao lặp lại sai lầm của họ? Bây giờ chúng ta biết rằng các tên dài hơn được mô tả nhiều hơn và tạo ra ít nhầm lẫn hơn, vì vậy hãy gắn bó với cải tiến. Trên một ghi chú nhẹ hơn, đôi khi tôi cố gắng lén các biến số dài hơn vào toán học của mình, tại đó mọi người đều kinh hoàng.


Bạn sẽ thích điều này ...

0

Định dạng đúng cho một phương trình lập trình là một định dạng mà bạn vẫn hiểu sau khi không thấy nó trong sáu tháng.

Nếu bạn quay lại:

n*R*T/P;

Và bạn nhận ra những gì đang xảy ra, thì có lẽ nó ổn. Thông thường đối với các công thức nâng cao, tôi sẽ không nhớ từng phần là gì trừ khi tôi chủ động sử dụng nó. Cho tôi:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

là một định dạng phương trình tốt hơn nhiều vì tôi có thể dễ dàng hiểu từng phần, ngay cả khi tôi không nhất thiết phải biết tại sao phương trình được viết như vậy.


Bạn nghĩ rằng Energy_in_joules = mass_in_kilograms * pow (speed_of_light_in_vacumm_in_metres-per_second, 2) dễ dàng hơn E = mc ^ 2
Martin Beckett

@Martin Beckett, bạn đã thực sự đọc những gì tôi đã đăng? "Thông thường đối với biểu mẫu nâng cao, tôi sẽ không nhớ từng phần là gì trừ khi tôi chủ động sử dụng nó." Tôi đã không nói rằng tôi sẽ quên các phương trình đã tự đẩy mình vào kiến ​​thức công cộng. Trong trường hợp như E=m*(c^2)tôi sẽ hiểu nó trong sáu tháng.
zzzzBov

đối với các phương trình cổ điển nổi tiếng, tốt hơn là sử dụng ký hiệu bình thường để mọi người có thể phát hiện ra nó. Thậm chí đến mức đặt tên biến theta hoặc phi nếu đó là những gì được sử dụng trong miền
Martin Beckett

-1

Tung đồng xu.

Đôi khi bạn cũng dành nhiều thời gian suy nghĩ về cách đặt tên một biến hơn là bạn dành cho chính mã hóa?


6
Có, tôi thường dành nhiều thời gian hơn để thiết kế mã của mình hơn là mã hóa nó, và nó bắt đầu bằng việc hiểu vấn đề và đặt tên đúng.
Mathias
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.