Những ưu và nhược điểm của ngôn ngữ sử dụng khoảng trắng so với {} 'để chỉ phạm vi là gì? [đóng cửa]


16

Dường như có một cuộc xung đột về việc sử dụng khoảng trắng hoặc mã thông báo như dấu ngoặc để biểu thị phạm vi. Tôi đã thấy nhiều lời khen ngợi giải pháp của python cho vấn đề thụt đầu dòng không nhất quán, nhưng nhiều người không đồng ý:

Bất kỳ ngôn ngữ nào có khoảng trắng là mã thông báo cần phải chết.

đăng sau cùng câu trả lời:

Tôi đã sắp xếp các mã thông báo chống khoảng trắng, cho đến khi tôi thực sự thử nó. Có lẽ nó giúp bố cục không gian trắng cá nhân của tôi khá phù hợp với những gì mọi người ở vùng đất trăn sử dụng. Có lẽ tôi hơi tối giản, nhưng nếu bạn định thụt lề, tại sao phải bận tâm với {} s?

Tôi có thể thấy một số đối số rõ ràng cho mỗi bên:

sử dụng khoảng trắng:

  • giúp giảm sự thụt dòng không nhất quán trong mã
  • xóa màn hình bằng cách thay thế các mã thông báo hiển thị bằng khoảng trắng để phục vụ cùng một mục đích

sử dụng mã thông báo:

  • dễ dàng hơn nhiều để cắt và dán mã đến các cấp độ khác nhau (bạn không phải sửa lỗi thụt lề)
  • phù hợp hơn. Một số trình soạn thảo văn bản hiển thị khoảng trắng khác nhau.
  • phổ biến hơn hiện nay.

Có điểm nào tôi bỏ lỡ không? Bạn thích cái nào hơn Bất kỳ lời nói khôn ngoan sau khi đã làm việc với người này hay người kia trong một thời gian dài?


Tái bút Tôi ghét nó khi các ngôn ngữ không sử dụng cùng một mã thông báo cho mỗi cấu trúc điều khiển. VB thực sự khó chịu với các câu lệnh End IfEnd Whilecâu lệnh của nó , hầu hết các ngôn ngữ khác chỉ sử dụng {} 'cho mọi thứ. Nhưng có lẽ đó là một chủ đề cho một câu hỏi khác ...


2
Tôi không nói nó "dễ cắt và dán hơn". Nó chỉ dễ dàng hơn một chút.
Kugel

1
Miễn là bạn giữ các khối mã nhỏ và có tổ chức, các mã thông báo thực sự không quan trọng ... nhân tiện, hãy yêu thích thẻ 'chiến tranh thần thánh', lol
Scott

"Một số trình soạn thảo văn bản hiển thị khoảng trắng khác nhau.": ?? "Hiện nay phổ biến hơn.": Mức độ phổ biến thường không liên quan đến chất lượng của một ý tưởng.
Giorgio

Tôi yêu cú pháp khoảng trắng và tôi thích mã hóa trong CoffeeScript và Haskell (vâng tôi biết nó khó). Tôi đã mã hóa một bó bằng JavaScript và C và tôi không thể quay lại}. Tuy nhiên, biểu thức của Lisp khi chúng được thay thế bằng div hộp là tốt nhất :)
aoeu256

Câu trả lời:


15

Tôi nghĩ rằng rất nhiều người trong số chúng tôi lập trình viên (bao gồm cả bản thân tôi) có xu hướng "logic hóa" mọi quyết định. Điều đó tốt, nhưng không phải câu hỏi nào cũng có câu trả lời hợp lý. Ví dụ, tôi nghi ngờ rằng các đầu bếp đăng câu hỏi trên Chefoverflow (nếu điều đó tồn tại) yêu cầu những ưu và nhược điểm của bánh táo so với bánh anh đào. Đó là một câu hỏi mà bạn thích tốt hơn.

Với ý nghĩ đó, tôi nghĩ câu trả lời đơn giản nhất là nói "Một số người thích niềng răng, một số người thích khoảng trắng" và để nó ở đó.



Ngoài ra, một cái gì đó chuyên nghiệp cho một số có thể là một lừa đảo cho những người khác.
Larry Coleman

Điểm tuyệt vời. Cá nhân tôi nghĩ rằng họ làm việc cùng nhau, và miễn là giáo hoàng rõ ràng, tôi sẽ không phàn nàn (nhiều).
Michael K

7
Tôi không đồng ý với sự tương tự của bạn. Có những lý do khá khách quan để tin rằng cú pháp phụ thuộc vào khoảng trắng làm cản trở năng suất của lập trình viên, ngay cả ở những lập trình viên yêu thích nó. Nó giống như nói rằng mọi người chỉ không thích mùi vị của xyanua - mọi người chỉ là logic hợp lý khi họ nói rằng nó độc. Không. Không quan trọng bạn yêu nó đến mức nào, nó vẫn sẽ giết bạn.
Timwi

4
PS Từ bạn thực sự tìm kiếm là hợp lý hóa . Ngoài ra, mọi người đều có xu hướng hợp lý hóa, không chỉ các lập trình viên.
Timwi

10

Có nguy cơ nghe giống như một fanboy hoàn toàn, tôi nghĩ rằng tất cả những người tuyên bố rằng khoảng trắng giúp giảm bớt sự thụt dòng không nhất quán trong mã Code chưa bao giờ sử dụng Visual Studio. Với một lệnh duy nhất (tôi nghĩ rằng phím tắt mặc định là Ctrl + K, D), tất cả các vết lõm là nhất quán tức thời¹. Hơn nữa, khi dán mã, vết lõm được sửa ngay lập tức mà không phải làm gì cả, và điều tương tự cũng đúng khi viết mã mới hoặc khi bọc một thứ gì đó trong một ifhoặc một khối khác (định dạng lại xảy ra khi }gõ). Hơn nữa, nhấn Enter sau khi hoàn thành câu lệnh luôn đặt con trỏ ở mức thụt lề chính xác cho câu lệnh tiếp theo, ngay cả khi câu lệnh trước đó được thụt lề thêm vì mộtifhoặc tương tự, làm cho rất khó để vô tình nghĩ rằng một tuyên bố vẫn còn dưới một ifkhi nó không.

Điểm tôi đang cố gắng thực hiện không phải là Visual Studio là tuyệt vời. Điểm tôi đang cố gắng thực hiện là IDE có thể tự động sửa lỗi thụt lề (và các vấn đề định dạng khác), nhưng chỉ khi ý nghĩa của chương trình không phụ thuộc vào định dạng của nó. Điều này cung cấp cho lập trình viên một cơ hội lớn hơn để tập trung vào nhiệm vụ lập trình thực tế. Một cú pháp như Python là phản tác dụng: không thể viết một IDE có thể khắc phục lỗi khắc phục mã xác thực mã Python vì chính thụt chỉ định một số ngữ nghĩa.


¹ (Tôi biết có một trường hợp đặc biệt mà VS từ chối định dạng lại, cụ thể là literals mảng mà span nhiều dòng, nhưng đó là bên cạnh điểm.)


8
Việc thụt Python không cần sửa vì nó không bị hỏng (mà không có ai để ý!). Không thể viết Purify (chương trình giúp phát hiện rò rỉ bộ nhớ) cho C #, không có nghĩa là quản lý bộ nhớ C ++ là ưu việt.
dbkk

2
@Dean: Tại sao nhiều người nghĩ rằng họ cần Resharper cho mọi thứ? Những gì bạn mô tả đã có trong Visual Studio mà không cần Resharper.
Timwi

2
@dbkk: thụt lề của bạn bị hỏng ngay khi bạn thêm một ifdòng ở bất cứ đâu. Sau đó, bạn phải tiến hành sửa vết lõm bằng tay.
Timwi

2
có lẽ bạn chưa từng làm việc trong một nhóm mà việc thụt lề là lười biếng, không nhất quán, v.v. và việc sửa nó không được khuyến khích vì điều đó làm cho mã khác biệt là không thể.
Kevin

2
@ Kevin: Đúng vậy, tôi đã không, và thẳng thắn, tôi sẽ không muốn. Tôi khăng khăng sửa tất cả trong một lần, điều này chỉ gây ra một khác biệt không thể đọc được, điều này chỉ ảnh hưởng đến khoảng trắng không đáng kể và sửa tất cả các khác biệt trong tương lai. Bất cứ điều gì khác sẽ phản tác dụng và có hại cho dự án.
Timwi

2

Cá nhân tôi thấy tôi cần dòng trống được giới thiệu bằng cách có mã thông báo trên dòng riêng của nó để khiến tâm trí tôi nhận ra rằng mã nằm trong phạm vi khác.

Tôi ghét nó khi ở python mọi người đi:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

Trong khi ở vùng đất token tôi ghét khi mọi người sao chép và dán và không dọn sạch vết lõm ,

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

hoặc không sử dụng một dòng riêng cho mã thông báo .

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

Tôi có thể đọc cả ba, nhưng chúng không như tôi mong đợi và tôi phải nỗ lực để phân tích chúng và như Joel nói khi mọi thứ không hoạt động như bạn mong đợi, điều đó làm bạn thất vọng.


2

Pro: Không có cuộc chiến thần thánh thụt lề / uốn cong trong thế giới Python theo như tôi biết. Đưa ra quyết định này thay mặt cho các nhà phát triển có lẽ đã cứu được một số nỗi đau.

Con: Hàm ẩn danh được giới hạn trong một dòng. Nghe có vẻ ổn, nhưng tôi thường thấy mình viết lên nhiều dòng lambdatrong Scheme (chủ yếu để cung cấp cho maphoặc applyở một nơi chính xác, vì vậy sẽ không có ý nghĩa gì khi khai báo riêng).



Biểu thức nhiều dòng được hỗ trợ trong Python - chỉ cần đặt \ ở cuối dòng.
dbkk

7
Công bằng mà nói, việc thiếu lambdas đa dòng là một hạn chế của Python, không phải là khoảng trắng nói chung. Trong ngôn ngữ phân cách khoảng trắng của tôi, nếu bạn giới thiệu lambda và khối thụt theo sau, khối được sử dụng làm thân lambda.
Lưu ý đến bản thân - nghĩ về một cái tên

@ Chú ý - Ok, vâng, công bằng. Python chỉ là ngôn ngữ phân định khoảng trắng duy nhất tôi có bất kỳ kinh nghiệm nào. @dbkk vì vậy bạn đang nói rằng lambda n: a = n \\na.sort() \\na[0:3] sẽ không trả về lỗi cú pháp? Thủ thuật `\` cho phép bạn trải lambda một dòng trên nhiều dòng, nhưng bạn vẫn không nhận được nhiều hơn một dòng thực tế .
Inaimathi

Haskell, CoffeeScript sử dụng khoảng trắng nhưng không có giới hạn lambda dòng đơn.
aoeu256

2

Vấn đề tôi tìm thấy với một ngôn ngữ khoảng trắng là với các biểu thức điều kiện nhiều trang. Thêm một dòng ở giữa trang hai và thoát khỏi một khoảng trống ở giữa tất cả các mớ hỗn độn, có thể làm thay đổi mạnh mẽ logic của mã của bạn. Và ngay cả khi mã của ai đó là "chính xác", cố gắng đọc nó sẽ tạo ra một trò chơi đoán khủng khiếp. Cái "nếu" này là "cái khác" để làm gì? Tôi có thể đếm niềng răng dễ dàng hơn nhiều so với tôi có thể đếm các ký tự trống vô hình. Và các máy móc đăng bài trên trang web này tiếp tục đập chúng vào một không gian duy nhất.

IMHO "{{{{{" is more reliable than "     ".

9
Nếu bạn sử dụng các biểu thức điều kiện nhiều trang, bạn có vấn đề khác. Đừng làm điều đó. Trong thực tế, ngay cả với dấu ngoặc nhọn, mã trở thành một mớ hỗn độn không thể đọc được. Đây thực sự là một lợi ích khác của việc thụt lề khoảng trắng: nó ngăn bạn viết mã khủng khiếp như vậy.
Konrad Rudolph

1
Nghiêm túc, một điều kiện nhiều trang dài?
Winston Ewert

2

{} thêm dự phòng. Quá nhiều dư thừa là xấu, quá ít là xấu. Và hướng dẫn nhập nó là xấu, đặc biệt. Nếu nó khó sử dụng.

Vì vậy, trong thời điểm xấu / không có IDE, kiểu khoảng trắng có thể tốt hơn một chút. Nhưng với IDE mạnh mẽ, niềng răng tốt hơn.


1
Bạn nghĩ rằng một điểm tốt về sự dư thừa tôi nghĩ. Tôi đã nghiên cứu về trình phục hồi phân tích cú pháp cho trình biên dịch trong một thời gian (sau những nỗ lực rất thú vị của Clang để phát hành Fix-Its cho mã) và điều thực sự hữu ích ở đây là có sự dư thừa. Do đó, tôi nghĩ rằng không có sự dư thừa, trong khi tuyệt vời trong một thế giới hoàn hảo, thực sự có hại cho lập trình thế giới thực. Khi các nguồn thông tin dư thừa thông thường không đồng ý, thì đó có thể là lỗi đánh máy / lỗi đã được thực hiện; không có sự dư thừa, lỗi tiềm ẩn này không bị phát hiện! Điều đó đang được nói, tôi không thích niềng răng;)
Matthieu M.

"Tiếng ồn" là từ mà Erik Meijer sử dụng trong các video Haskell của mình.
dùng16764

Điều gì xảy ra nếu bạn xóa một khối và bạn quên xóa} hoặc xóa {do nhầm lẫn khi làm ngược lại? Dự phòng đi ngược lại IMO DRY.
aoeu256

2

Tôi không nghĩ rằng nó thực sự so với .
Pythoneers thường chỉ trích các lập trình viên niềng răng như thể họ sẽ dễ dàng vi phạm thụt vì họ có thể.
Trong thực tế, tôi luôn sử dụng thụt đầu dòng nhất quán 100% ngay cả trước khi biết về Python và phạm vi thụt lề của nó.

Thực tế là các ngôn ngữ niềng răng cũng có thể áp đặt thụt lề chính xác trong trình biên dịch và chúng ta sẽ có cả hai thế giới tốt nhất. Xem? không so với tất cả.

Pythoneers sẽ lập luận rằng niềng răng là vô dụng khi thụt là một phần của cú pháp, nhưng chúng không phải, niềng răng cải thiện khả năng đọc. Tôi đã thử lập trình Python và đó là một ngôn ngữ rất thú vị đối với tôi, nhưng bạn đã thử có if-elifchuỗi hơn 2 hoặc 3 cấp độ thụt lề chưa? Trông chúng không còn gọn gàng nữa.

PS: Tôi đã viết niềng răng nhưng theo cách tổng quát hơn, ý tôi là mã thông báo phân cách. Cú đúp mở đầu có thể được coi là dư thừa, nhưng một ngôn ngữ có thể đi như thế này (thực tế tôi chắc chắn có những ngôn ngữ chính xác như thế này nhưng tôi không biết rõ về chúng):

if condition:
    statement
    other_statement()
end

PS2: 2019, 4 năm sau câu trả lời này. Tôi đã học Python và hoàn toàn quen với việc thụt ngữ nghĩa của nó và không thấy khó đọc chút nào. Đặc biệt với sự trợ giúp của các IDE hiện đại vẽ các thanh dọc để hỗ trợ xác định các khối thụt lề.


Tôi thích cú pháp đó vì nó là một sự thỏa hiệp tốt và tránh niềng răng. Nhưng thật tốn kém cho các câu lệnh một dòng, trong đó, ví dụ như trong C, chúng ta có thể loại bỏ hoàn toàn niềng răng :(
Jo So

thay vì lồng nhau nếu ... elif bạn có thể thử sử dụng từ điển và / hoặc, tiếp tục, trả về, các hàm lồng nhau ...
aoeu256

@ aoeu256 hoàn toàn không phải là điểm của câu hỏi và câu trả lời của tôi.
Petruza
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.