Tại sao một số ngôn ngữ khuyên bạn nên sử dụng khoảng trắng thay vì tab? [đóng cửa]


10

Có lẽ tôi đơn độc trong việc này, nhưng có vài điều làm tôi khó chịu như mọi người thụt vào sử dụng khoảng trắng thay vì các tab. Làm thế nào là gõ SpaceSpaceSpaceSpacedễ dàng và trực quan hơn so với gõ Tab? Chắc chắn, chiều rộng của tab là khác nhau, nhưng nó cho thấy không gian thụt lề nhiều hơn không gian. Điều tương tự cũng xảy ra đối với khoảng cách; backspace một hoặc bốn lần?

Tại sao các ngôn ngữ như Python khuyên bạn nên sử dụng khoảng trắng trên các tab?


24
Bạn có thể định cấu hình hầu hết các trình soạn thảo để chèn khoảng trắng thay vì các tab khi bạn nhấn tab. Nếu bạn không thể định cấu hình trong trình chỉnh sửa yêu thích của mình, bạn cần một trình chỉnh sửa tốt hơn.
Adam Lear

một điều, nhiều trình soạn thảo có thể được thiết lập để chèn 4-8 khoảng trắng khi nhấn 'tab', do đó, đây chỉ là một phím bấm giống như tab.
Echo nói Phục hồi Monica

2
Nó vẫn không trả lời câu hỏi của tôi. Tại sao không gian thay vì các tab? Chắc chắn, bạn có thể định cấu hình trình chỉnh sửa của mình để chèn khoảng trắng thay vì tab, nhưng bạn cũng có thể chèn các tab có khoảng trắng. Câu hỏi là tại sao bạn muốn làm điều này? Những lợi ích có thể có được là gì?
Naftuli Kay

4
@Tk Spaces là các tab rõ ràng có thể được thay đổi
Martin Beckett

3
@TKKocheran, vì các tab làm những điều thú vị cho đầu ra của bạn khi bạn vô tình chèn chúng vào một chuỗi.
zzzzBov

Câu trả lời:


15

Tính nhất quán, chủ yếu.

Ngoài ra, đôi khi có thứ gì đó thực sự sử dụng khoảng trắng - như Python: Nói cho tôi biết, chuyện gì sẽ xảy ra nếu tôi chạy đoạn mã sau đây?

def foo():
    print "a"
    print "b"

Trả lời: Bạn sẽ nhận được IndentationError, vì hai câu lệnh in đó không được thụt lề ở cùng cấp - và do đó không phải là một phần của cùng một khối mã. (Cái đầu tiên sử dụng một tab, cái thứ hai tất cả các khoảng trắng)

Sau đó, có những trường hợp bực bội khi một trình soạn thảo của nhà phát triển có các tab được đặt thành 8 khoảng trắng và một trường hợp khác được đặt thành 4 và ai đó sử dụng 5 vì một số lý do kỳ lạ ... Nó có thể trông hoàn toàn bình thường trên một máy trạm, nhưng sau đó khi nó được kiểm tra SVN và ai đó cập nhật, họ sẽ thấy một mớ hỗn độn kinh khủng.

Vì vậy, đó là hai lý do thực sự tốt để luôn nhất quán, cho dù đó là không gian hoặc tab.

Nhưng, không gian cho phép kiểm soát thụt lề nhiều hơn nhiều so với các tab và không yêu cầu bất kỳ cấu hình đặc biệt nào trong trình chỉnh sửa để nó hoạt động. (Mặc dù có thể dễ dàng hơn - ví dụ, trong vim, chỉ cần sử dụng set expandtabđể chèn khoảng trắng bất cứ khi nào bạn nhấn tab)

EDIT: Và thật thú vị, trang web dường như đã bình thường hóa các tab của tôi thành không gian để trình duyệt có thể hiển thị chính xác. Nhấp vào "chỉnh sửa" để xem bản gốc, các tab được bao gồm;)


5
Các vấn đề của bạn với các tab (đặc biệt là sự lộn xộn SVN khủng khiếp) chỉ xảy ra nếu bạn sử dụng tùy chọn tab-to-space trong trình chỉnh sửa của mình. Nếu bạn và nhóm của bạn đồng ý tắt tùy chọn tab-to-space, thì một tab sẽ luôn là một tab trong bất kỳ chế độ xem nào: đó chỉ là một lựa chọn về độ rộng mà bạn muốn nó hiển thị trong trình chỉnh sửa của bạn.
HorusKol

@HorusKol Không, sự lộn xộn khủng khiếp là do không gian và các tab bị trộn lẫn. Tôi đoán rằng tôi đã không làm cho điều đó đủ rõ ràng (xem câu đơn độc sau dòng "hỗn độn kinh khủng"). Vì vậy, các không gian được tạo để căn chỉnh độc đáo với các tab khi chúng được đặt thành tương đương 4 không gian, nhưng sau đó khi người khác xem nó (cho dù có đặt tab vào không gian hay không), chúng sẽ bị rối.
Izkata

4
Tôi hiểu rồi - tốt, bạn cần thiết lập một hướng dẫn cho nhóm của mình - hoặc luôn sử dụng các khoảng trắng HOẶC các tab ... dù bằng cách nào, các tab đến không gian là một ý tưởng tồi trong tất cả các vòng;)
HorusKol

21
Đây là lý do tại sao tôi coi ý tưởng về các ngôn ngữ có ý nghĩa khoảng trắng là một lỗ hổng thiết kế. Những thứ bạn không thể thấy sẽ không bao giờ phá vỡ mã của bạn.
Paul Nathan

Chỉ để ghi lại, tôi đồng ý với @PaulNathan
Izkata

11

Đây là một cuộc thảo luận tốt về thụt lề và khoảng trắng trong Python; từ bài viết:

[Tôi] có thể là một ý tưởng tốt để tránh các tab hoàn toàn, bởi vì ngữ nghĩa của các tab không được xác định rõ trong thế giới máy tính và chúng có thể được hiển thị hoàn toàn khác nhau trên các loại hệ thống và trình soạn thảo khác nhau. Ngoài ra, các tab thường bị hủy hoặc chuyển đổi sai trong các hoạt động sao chép và dán hoặc khi một đoạn mã nguồn được chèn vào trang web hoặc loại mã đánh dấu khác.

Đối với lập luận của bạn về việc nhấn phím cách hoặc phím lùi 2 lần trở lên, vì hầu hết các trình soạn thảo mã nguồn sẽ chèn một số khoảng trắng có thể định cấu hình bằng một lần nhấn phím tab và không thụt lề tương tự, không có thêm phím nào được nhấn khi sử dụng không gian để thụt lề.

Đối với bản thân tôi, tôi thích các khoảng trắng hơn vì mã luôn được hiển thị với cùng một mức thụt lề, cho dù tôi đang xem nó trong IDE hay lesshoặc Notepad; tức là không gian di động hơn.


3
re: "cho dù tôi đang xem nó trong IDE, hoặc ít hơn, hoặc Notepad; tức là không gian dễ di chuyển hơn" - đây là đối số tốt nhất cho các không gian tôi từng nghe. Bản thân tôi là một anh chàng "tab", nhưng đôi khi không thích nhìn thấy mã khoảng cách giữa các tab được hiển thị theo những cách không mong muốn.
Aerik

2

Trong thụt lề Python điều khiển luồng chương trình và vì vậy rất quan trọng.
Nếu bạn lấy mã được định dạng bằng các tab và sao chép nó để các tab bị thay đổi hoặc mất cấu trúc của mã bị phá hủy. Không gian luôn là không gian = an toàn hơn nhiều.

Nếu sự hao mòn trên thanh không gian của bạn làm bạn lo lắng, trình chỉnh sửa của bạn có thể được thiết lập để tự động chuyển đổi các tab thành khoảng trắng.


Tôi quan tâm nhiều hơn đến việc lãng phí thời gian gõ không gian hoặc xóa lùi bốn lần so với một lần nhấn phím để làm cả hai.
Naftuli Kay

Vâng, nhưng Python là lạ theo cách đó. Tôi chưa bao giờ bắt gặp bất cứ điều gì khác quan tâm đến không gian.
Aerik

@TKKocheran Ồ, đó là mối quan tâm thực sự của bạn? Tôi không biết họ đã làm như thế nào, nhưng vim trong công việc của tôi được thiết lập để backspace quay trở lại tabstop cuối cùng, trên nhiều không gian, hoàn toàn trong suốt
Izkata

Bạn có thể đổ .vimrccho tôi không :)
Naftuli Kay

1
@TKKocheran Tìm thấy nó - chỉ là set softtabstop=4, và cả TAB và BACKSPACE sẽ sử dụng 4 khoảng trắng làm tab. (Chà, với mỗi tabstop, coi chiều rộng là 4 khoảng trắng)
Izkata

2

Không gian luôn phải được sử dụng, bởi vì các tab không đủ linh hoạt cho nhiều kiểu và các tab và khoảng trắng (gần như) luôn tạo ra một mớ hỗn độn tuyệt đối.

Để biết ví dụ về một kiểu thường cần khoảng trắng, hãy xem xét một số thứ như:

call_some_function(parameter1,
                   parameter2,
                   parameter3,
                   parameter4,
                   parameter5,
                   parameter6,
                   parameter7);

Trừ khi bạn sẵn sàng đặt tên lại cho tất cả các chức năng của mình thành bội số chính xác của kích thước tab (trừ một cho dấu ngoặc đơn), nếu không, sẽ không làm điều này.

Khi trộn các tab và khoảng trắng, bạn gần như ngay lập tức gặp phải một vấn đề nghiêm trọng: các tab không nhất quán được mở rộng theo cùng một cách. Một số phần mềm coi một tab tương đương với một số không gian cụ thể. Phần mềm khác sẽ mở rộng một tab modulo một số khoảng trắng cụ thể - ví dụ: một mục sau một tab sẽ luôn bắt đầu ở một số cột là bội số của (ví dụ) 8.

Ngay cả khi bạn có thể đảm bảo chống lại các không gian bị trộn lẫn với các tab của mình, bạn vẫn gặp một vấn đề: các tab cũng chơi kém với phông chữ có chiều rộng thay đổi. Vấn đề này phát sinh khi (ví dụ) bạn muốn nhận xét theo dõi được căn chỉnh:

a.m = 9;   // this is the slope
a.i = 4;   // this is the intensity
a.x = 1;   // this is the x-intercept

Khi họ đứng ngay bây giờ, tất cả những người xếp hàng hoàn hảo. Được xem với một phông chữ có chiều rộng thay đổi, tuy nhiên, mọi thứ trở nên xấu xí. Với không gian, các bình luận có thể (thường sẽ) hơi bị sai. Tuy nhiên, với các tab, việc sắp xếp sai thường trở nên khá triệt để:

a.m = 9;          // this is the slope
a.i = 4;  // this is the intensity
a.x = 1;          // this is the x-intercept

Đột nhiên, sự khác biệt nhỏ về chiều rộng giữa 'i' và 'm' hoặc 'x' trong phông chữ có chiều rộng thay đổi của chúng tôi đã được phóng to lên toàn bộ điểm dừng của tab.

Điểm mấu chốt là hầu như bất kỳ thay đổi nào trong cách bạn xem mã bằng các tab, cho dù có vẻ tầm thường, có thể và thường sẽ tạo ra một mớ hỗn độn không thể đọc được.

Để trả lời các câu hỏi khác của bạn: người khác đã chỉ ra nó, nhưng tôi không thể tưởng tượng bất kỳ ai trong trình soạn thảo lập trình (hoặc nhiều thứ khác) thực sự sử dụng thanh dấu cách để chèn khoảng trắng, vì vậy câu hỏi của bạn về: "gõ spacespacespacespace" là không liên quan bởi vì không ai làm điều đó để anyway. Tương tự như vậy với khoảng cách lùi: thật khó để tưởng tượng một trình soạn thảo sẽ yêu cầu nhấn BkSpcbốn lần để đi đến điểm dừng tab trước đó, vì vậy (một lần nữa) câu hỏi không liên quan.

Tóm lại: các tab cũng tốt nếu bạn (và chỉ có bạn) sẽ không bao giờ nhìn vào mã của bạn, và bạn chỉ bao giờ làm như vậy với một trình soạn thảo duy nhất mà bạn không bao giờ reconfigure (ở tất cả!) Những điều kiện này, tuy nhiên, rất gần như không thể thực thi rằng chỉ có một câu trả lời hợp lý: không bao giờ sử dụng các tab.


1
Tôi thấy bạn nói "phông chữ tỷ lệ phá vỡ cả không gian và tab nhưng chúng phá vỡ các tab tồi tệ hơn, vì vậy hãy sử dụng khoảng trắng". Tại sao không sử dụng tabstops đàn hồi? nickgravgaard.com/elastictabstops
amara

@sparkleshy: Đó là một ý tưởng hay, nhưng không có gì khác biệt so với mã thực và sẽ không cho đến khi tất cả (hoặc ít nhất là phần lớn) các biên tập viên thực sự đã bao gồm nó.
Jerry Coffin

... Tôi biết: '(- ừm dễ dàng hơn.
amara

2
Nếu bạn đang lập trình theo phông chữ theo tỷ lệ chiều rộng, thì bạn đã gặp nhiều vấn đề hơn là chỉ lo lắng về các tab ...
Brian Knoblauch

1
@BrianKnoblauch: Là một người sử dụng phông chữ eurofurence, tôi phải không đồng ý. Điều duy nhất từng gây ra cho tôi vấn đề là không gian. Tất nhiên nó cũng phải làm với phong cách thụt đầu dòng của tôi, đó là không bao giờ khác nhau nhiều hơn một tab giữa các dòng. Giả sử tôi đã bao giờ nhận được các tab đàn hồi, mã của tôi sẽ trông thậm chí còn tốt hơn.
Magus

2

Vấn đề lớn là sự không nhất quán của chiều rộng "tab" đôi khi chúng được hiển thị dưới dạng bốn khoảng cách đôi khi tám. Trong nhiều trình soạn thảo, bạn có thể đặt chúng thành bất cứ thứ gì từ 1 đến 9 khoảng trắng.

Vì vậy, điều này biến một trình soạn thảo WYSWYG đơn giản thành một thứ bạn thấy là những gì người khác MIGHT Get.

Đây là một vấn đề đặc biệt đối với Python, nhưng nó cũng là một vấn đề trong bất kỳ ngôn ngữ "dấu ngoặc nhọn" nào khi thụt lề được sử dụng để truyền đạt ý nghĩa cho người đọc và các tab bị rối khiến mã khó đọc.

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.