Tôi là câu trả lời thứ hai của Michael Kent (và tôi đã upvoted nó).
Ngoài ra, bạn cũng nên đọc "PEP 8" và hấp thụ các bài học của nó.
http://www.python.org/dev/peps/pep-0008/
Nhưng Python, với không gian tên của nó, tính năng mạnh mẽ, và các lớp hướng đối tượng, nên cho phép bạn sử dụng tên viết tắt của thuận tiện mọi thứ.
Trong C, bạn cần sử dụng số nhận dạng dài trong nhiều trường hợp vì tên cần phải là duy nhất trong phạm vi nhất định. Như vậy:
char *StringFromInt(int x);
char *StringFromFloat(float x);
char *StringFromUnsigned(unsigned int x);
char *str_temp = strdup(StringFromUnsigned(foo_flags));
Trong Python, tất cả những sẽ là BUILTIN str()
:
temp = str(foo_flags)
Trong C++ bạn có các lớp học và không gian tên, vì vậy bạn sẽ có thể sử dụng tính năng hướng đối tượng như trong Python, nhưng trong C bạn cần tên duy nhất trên toàn cầu, vì vậy bạn thường phải làm những thứ như thế này:
typedef struct s_foo
{
// struct members go here
} FOO;
FooAdd();
FooSubtract();
StringFromFoo();
trong Python, bạn nên thể thêm chức năng thành viên, hoặc khai thác quá tải, nếu thích hợp:
class Foo(object):
def __init__(self):
# member variables initialized here
def add(self, x):
# add x to a Foo
def subtract(self, x):
# subtract x from a Foo
def __str___(self):
# return a string that represents a foo
f = Foo()
f.add(x)
f.sub(y)
# the following two both use __str__()
temp = str(f)
print(f)
Bạn cũng có thể ưu tiên các tên biến dài thực sự cho mục đích tự lập tài liệu. Tôi thích terseness:
import math
class Circle(object):
"""\
Circle: a class representing a circle in a plane.
Includes the following member functions:
area() -- return the area of the circle"""
def __init__(self, center=Point([0, 0]), radius=0.0):
"""\
Circle(center, radius)
center must be an instance of class Point() or convertible to Point()
radius must be an int or float and must not be negative"""
if radius < 0:
raise ValueError("radius must be >= 0")
self.center = Point(center)
self.radius = float(radius)
def area(self):
"returns area as a float."
return math.pi * self.radius ** 2
c = Circle([23, 45], 0.5)
print(c.area())
class CircleGraphicsObject(object):
def __init__(self, CenterOfTheCircle, RadiusOfTheCircle):
# init code goes here
def AreaOfTheCircle(self):
return math.pi * self.RadiusOfTheCircle ** 2
CircleInstance = CircleGraphicsObject(PointObject([23, 45]), 0.5)
print(CircleInstance.AreaOfTheCircle())
Tôi đặc biệt thích phong cách đầu tiên, ngắn gọn đến thứ hai. Theo PEP 8, tôi thích các tên biến số thấp hơn (chẳng hạn như c
cho cá thể Circle
). Trong Python, nó cũng thường được khuyến khích sử dụng "Duck Typing" giống như tôi đã làm trong lớp terse: nếu bạn muốn bán kính là một phao, sau đó ép nó vào một float
trong __init__()
thay vì kiểm tra loại của nó. Tương tự, thay vì kiểm tra xem bạn có được thông qua phiên bản Point
hay không, chỉ cần ép buộc bất kỳ điều gì bạn nhận được vào một số Point
.Bạn đang cho phép Point.__init__()
tăng ngoại lệ nếu đối số không có ý nghĩa là Point
; không cần kiểm tra thêm trong Circle.__init__()
. Ngoài ra, chức năng Point.__init__()
của bạn có thể kiểm tra rõ ràng xem bạn đã vượt qua nó chưa, ví dụ Point
và trả lại phiên bản không thay đổi, nếu thực sự tốn kém để bắt đầu Point
. (Trong ví dụ này, một Point
thực sự chỉ là một cặp giá trị, vì vậy nó có thể đủ nhanh để chỉ tạo lại điểm và bạn không cần kiểm tra.)
Bạn có thể nhận thấy cách kỳ lạ mà tôi đã làm chuỗi ba dòng được trích dẫn nhiều dòng. Bởi vì các quy tắc thụt lề trong Python, tôi cần phải thụt lề chuỗi được trích dẫn ba, nhưng tôi không muốn thụt lề các dòng của chuỗi bởi vì thụt lề sẽ là một phần của chuỗi. Thực sự tôi muốn tất cả các dòng khác nhau ở lề trái, vì vậy tôi có thể thấy rõ các dòng đó đang nhận được bao lâu (và đảm bảo chúng có tất cả 79 ký tự hoặc ngắn hơn). Vì vậy, tôi sử dụng dấu gạch chéo ngược để cho phép dòng đầu tiên của chuỗi nhiều dòng nằm ở lề trái với các dòng khác, mà không chèn một dòng mới ở đầu chuỗi nhiều dòng.
Dù sao, phong cách terser nghĩa tên biến của bạn và như vậy là dễ dàng hơn để gõ, và nó dễ dàng hơn để phù hợp với đường dây của bạn trong giới hạn 79-cột khuyến cáo của PEP 8.
Nó thậm chí sẽ không được hoàn toàn kinh khủng khi sử dụng tên thành viên nội bộ dài một chữ cái, trong một lớp đơn giản như thế này. Chỉ với hai thành viên, bạn có thể sử dụng khá tốt .c
cho thành viên trung tâm và .r
cho bán kính. Nhưng điều đó không mở rộng tốt và .center
và .radius
vẫn dễ dàng nhập và dễ nhớ.
Cũng là một ý tưởng rất hay khi đưa các tài liệu thông tin. Bạn có thể sử dụng tên hơi terse, nhưng có giải thích dài hơn trong docstring.
class Foo(object):
# init goes here
def area(self):
"returns area as a float."
return self.area
class VerboseFoo(object):
# init goes here
def AreaAsFloat(self):
return self.FloatAreaValue
Không gian tên thật tuyệt. Lưu ý mức độ rõ ràng của nó khi chúng tôi sử dụng math.pi
; bạn biết nó là hằng số toán học, và bạn có thể có một số biến cục bộ pi
(đối với "Chỉ mục chương trình" có lẽ) và nó không va chạm với hằng số toán học.
Một trong những vấn đề có thể là tên của bạn quá dài. Hãy thử suy nghĩ về những cách diễn tả ngắn hơn. – Amber
Tôi nghĩ tên của tôi thực sự rất dài vì các biến lớp. Nếu tôi gọi một hàm với ba biến lớp, chỉ là "tự". phần của những tên biến đó đã giết chết 15 ký tự. Về mặt rút ngắn tên nói chung, tôi thực sự chống lại việc thay đổi tên thành một cái gì đó không thể hiểu được chỉ để tiết kiệm không gian. Tên nên càng nhỏ càng tốt trong khi vẫn mô tả chính xác nó là gì. – Eli
Được thăng hạng để phản đối yêu cầu của @Glenn Maynard. PEP 8 nói rõ ràng, "Giới hạn tất cả các dòng với tối đa 79 ký tự." – Johnsyweb