Những tính năng ngôn ngữ được coi là có hại? [đóng cửa]


20

Xin vui lòng, giải thích lý do và liệt kê các ngôn ngữ có tính năng (mis) được triển khai Theo như bạn biết.

Đăng những gì bạn cho là một tính năng có hại, không phải những gì bạn không thích.



2
@sbi Bạn cũng có thể đọc trong cùng một trang "XMLHttpRequest được coi là có hại" ...
HoLyVieR

1
Tất cả chúng được coi là có hại, bởi ai đó hoặc người khác, ngoại trừ có thể có các biểu thức cơ bản.
David Thornley


3
@David Thornley: a = 1/0- Biểu hiện cơ bản, có hại. ;-)
Orble

Câu trả lời:


37

Đăng ký Globals trong PHP

Thông tin: http://php.net/manual/en/security.globals.php

Đây là tính năng tồi tệ nhất từng được thực hiện vì lý do dễ đọc và lý do bảo mật. Về cơ bản, tất cả các tham số GET nhận được được chuyển thành các biến.

Ví dụ với URL này: /index.php?value=foobar

Bạn có thể làm như sau:

<?php
echo $value; // return foobar
?>

Khi bạn đang đọc mã, sẽ rất khó hiểu khi biết biến đó đến từ đâu.

Ngoài ra nếu tính năng này bị lạm dụng, nó có thể dẫn đến lỗ hổng bảo mật. Đây là một ví dụ mã từ php.net cho thấy cách nó có thể bị sử dụng sai:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

Thật kinh khủng. Mặc dù tôi có thể hiểu được mong muốn, nhưng việc giữ nó theo mặc định hoàn toàn không có ý nghĩa
TheLQ

14
Cần lưu ý và nhấn mạnh rằng các thanh ghi toàn cầu không được bật theo mặc định kể từ PHP 4.2 (hoàn toàn trở lại vào năm 2000), không được dùng trong PHP 5.3 (2009) và sẽ bị xóa hoàn toàn trong PHP 6, nhưng mọi người vẫn tiếp tục quay lại đến "OMG đăng ký toàn cầu" ngay cả sau 10 năm.

1
PHP khá vô vọng
Ming-Tang

@SHiNKiROU Không phải là vô vọng, tính năng đó không được chấp nhận và sẽ bị xóa trong PHP 6.
HoLyVieR

1
Điều đó không phải là vô vọng, nó chỉ thua xa rất nhiều ngôn ngữ khác mà lý do duy nhất bất kỳ ai sử dụng nó là bởi vì cho đến gần đây, việc mua webhosting giá rẻ cho nó dễ dàng hơn nhiều so với các ngôn ngữ khác.
trực giác

22

Cho phép Null theo mặc định, lỗi "nghìn tỷ" * đô la. Xin lỗi Tony Hoare. Hầu như mọi ngôn ngữ có sẵn trên hành tinh.

Tony Hoare giải thích

* Tôi đã điều chỉnh biểu thức do Tony Hoare đặt ra để phản ánh khoản lỗ thực tế vào những ngày này :-)


Đây không phải là một tính năng hoặc một sai lầm, mà là, thiếu tính năng. Có các loại tham chiếu không thể rỗng không phải là thứ bạn có thể nhẹ nhàng thả vào ngôn ngữ; Nó đòi hỏi rất nhiều suy nghĩ và thiết kế tốt, và rất khó để thực hiện theo cách không cảm thấy như đang chiến đấu với trình biên dịch. Spec # và Singularity cho thấy nó khó như thế nào.
imgx64

@ imgx86, không, đó chắc chắn là một sai lầm. Các loại tham chiếu không nullable là một tính năng được thêm vào để đáp ứng với lỗi null để cho phép khả năng tương thích với một hệ thống loại thường cho phép null.
Matt Olenik

@Kyralessa: Có lẽ anh ấy muốn chắc chắn rằng HoLyVieR có được huy hiệu Dân túy? :-) Tôi đồng ý, thật vô nghĩa khi chấp nhận câu trả lời của bạn như thế này.
Macneil

18

C và C ++ MACROS. Nếu tôi phải thấy một lỗi trình biên dịch khác do ai đó chọn tên hàm tiêu chuẩn cho macro của họ, điều đó sẽ làm hỏng mã của tôi, tôi sẽ hét lên. Hãy xem lần vi phạm cuối cùng:

#define vector(int) new VARIANT[int];

Có giá trị! Bạn đã làm gì với vector STL của tôi!?


Không gian tên là một trong những điều làm cho typedefs và mẫu ngay lập tức trở nên thân thiện hơn.
Shog9

4
Đồng ý, nhưng chỉ vì các ngôn ngữ hiện đại đã tìm thấy sự thay thế cho chức năng của các macro văn bản. Quay lại khi chúng được phát minh, macro là một điều tốt vì công nghệ trình biên dịch còn quá sơ khai.
dsimcha

bạn đã tìm thấy macro này ở đâu?
rwong

@dsimcha - Tôi không biết về điều này. Macro Lisp đã có từ rất lâu.
Jason Baker

2
@Jason: Tôi không đánh bại các macro AST "thực" theo phong cách Lisp, vẫn hữu ích và thú vị. Tôi chỉ ghét các macro kiểu C / C ++ hoạt động hoàn toàn ở cấp độ văn bản, không có khái niệm về phạm vi, cho phép người ta tạo ra các bản tóm tắt bị rò rỉ một cách lố bịch và mã bị che giấu, và hoàn toàn có thể bị lỗi thời bởi các tính năng hiện đại hơn, một trong số đó, trớ trêu thay , là các macro "thực".
dsimcha

14

Theo mặc định trong các câu lệnh chuyển đổi C và C ++.


18
Đây luôn là một tính năng hữu ích trong tất cả các mã tôi đã viết. Làm thế nào đây là một sai lầm?
greyfade

6
@greyfade: Nó hữu ích cho đến khi bạn quên breakcâu nói hoặc ai đó thêm trường hợp giữa hai trường hợp (hoặc đặt hàng lại chúng), không nhận thấy có sự rơi vào giữa chúng. Tôi không thấy bất kỳ cách nào mà dự phòng tốt hơn cách C # yêu cầu phá vỡ hoặc trường hợp goto, v.v.
Tim Goodman

9
Thiết bị của Duff chế giễu sự trừng phạt của bạn!
Jesse C. Choper

3
tôi đồng ý. Theo mặc định không phải là một tính năng tốt.

11
Có ai đọc không? Ông nói rằng sự sụp đổ của DEFAULT
Matt Olenik

13

Chuyển đổi loại ngầm định khi các loại được chuyển đổi giữa không có mối quan hệ rõ ràng. Ví dụ, chuyển đổi ngẫu nhiên, không số stringthành một int, như trong PHP.


7
Cần lưu ý rằng một khi bạn có được cái đầu của bạn xung quanh nó, loại điều này trở thành một vấn đề. Nó thực sự chỉ là vấn đề nếu bạn không thực hiện bất kỳ kiểm tra nào trong các khu vực quan trọng đối với các giá trị do người dùng nhập, nhưng vô cùng hữu ích nếu, giả sử, bạn biết thứ gì đó sẽ là một số, nhưng có dạng chuỗi. Ví dụ: một trường từ DB có thể sẽ được trả về dưới dạng một chuỗi và bạn không muốn lo lắng về việc truyền nó.
Tarka

2
@Slokun: Bạn có thể đưa ra một ví dụ tốt hơn không? Tại sao lưu trữ các giá trị tích phân trong db bằng cách sử dụng loại chuỗi?
Steven Evers

@SnOrfus Nhận một số được truyền vào một URL, đầu vào của người dùng, các hàm và những thứ khác phổ biến cho các ngôn ngữ không được nhập tĩnh.
TheLQ

Đây cũng là một vấn đề trong C, vì giá trị của chuỗi được trích dẫn là một con trỏ, có thể được chuyển đổi thành một số nguyên và điều này có thể làm cho các cấu trúc trông giống như chúng có thể được biên dịch đúng nhưng tạo ra vô nghĩa. Trong C ++, bạn có thể xác định các hàm chuyển đổi với từ khóa explicit, dừng các chuyển đổi kiểu ngầm định, nhưng vẫn còn vấn đề.
David Thornley

@TheLQ: Nếu đó là đầu vào của người dùng, bạn phải xác thực nó để tìm hiểu xem đó có phải là số không. Giống như @Slokun nói. Nếu bạn đang đọc dữ liệu từ một tệp, bạn có thể hy vọng dữ liệu số sẽ ở nơi cần đến, nhưng có một ngoại lệ được nêu ra trong trường hợp hỏng đĩa thường tốt hơn là chỉ có một 0giá trị ngẫu nhiên .
trực giác

12

goto : mặc dù ok trong các trường hợp hiếm hoi, nó thường bị sử dụng sai và dẫn đến các chương trình khó đọc.


Chúa tốt xkcd.com/292
TheLQ

3
Tôi đã thấy điều ngược lại khi cho phép sử dụng goto một cách hợp lý sẽ cứu một chương trình khỏi 3 triệu dòng mã.
Dave

2
Ah, cường điệu ... Một kỹ thuật văn học hợp lệ.
Robert Harvey

11

KHÔNG AI

Chỉ vì một tính năng bị lạm dụng thường xuyên không làm cho nó có hại.

IMHO toàn bộ "được coi là có hại" là Redlerio ad Hitlerum của các cuộc thảo luận ngôn ngữ lập trình.

Hầu hết, nếu không phải tất cả, các tính năng "có hại" có hoặc ban đầu, trường hợp sử dụng rất hợp lệ hoặc đơn giản là các phương thức tiện lợi ở nơi đầu tiên. Tùy thuộc vào các nhà phát triển để hiểu những ưu và nhược điểm và mã phù hợp.

Nếu câu hỏi của bạn có nghĩa là một cái gì đó dọc theo dòng chữ "tính năng ngôn ngữ nào có những cạm bẫy phổ biến hoặc tác dụng phụ đáng tiếc" thì câu trả lời của tôi sẽ khác.

[sửa] Để rõ ràng: Tôi không có nghĩa là tiếp tục sử dụng các phương pháp không dùng nữa. Nếu các nhà phát triển đang phản đối / loại bỏ một tính năng, bạn nên sử dụng thay thế. Tôi đang đề cập đến khái niệm rằng một phần hiện tại của ngôn ngữ được coi là có hại vì một số người không thích những gì nó khuyến khích hoặc sự đánh đổi liên quan đến việc sử dụng nó mà nhiều người thảo luận.


13
Tôi không đồng ý, một ví dụ phản biện tốt là câu trả lời của tôi. Đăng ký PHP toàn cầu thật tệ, không có vấn đề gì về cách bạn sử dụng chúng. Đây là lý do tại sao nó đã bị phản đối và khuyên mạnh mẽ không bao giờ sử dụng trên phiên bản PHP cũ hơn.
HoLyVieR

5
+1 Đặt vào tay kẻ xấu, bất kỳ cấu trúc ngôn ngữ nào cũng có hại.
mouviciel

5
Điểm hay ... ngay cả khi 95% gotos là xấu, bản thân tính năng này vẫn có giá trị cho 5% còn lại
eds

1
Tôi nghĩ nó giống như đặt nút ghế phụ bên cạnh nút bật / tắt radio. Bản thân tính năng này có thể không tệ, nhưng không ngăn chặn được tác hại do việc sử dụng nó vô tình.
LennyProgrammer

1
Tôi nghĩ rằng đây là chương trình tương đương với "súng không giết người, mọi người làm".
Orbled

7

Tự động hóa (hoặc tính năng liên kết biến-biến- (gán | sử dụng)) khác là tính năng mà tôi đã tìm thấy để cung cấp cho tôi nhiều lỗi nhất.


+1 - Chúng tôi có thể không đồng ý về đường lặp nhưng đây là điều tôi có thể đồng ý với 100%.
ChaosPandion

7

PLEASEtrong INTERCAL. Đừng sử dụng nó đủ, nó phàn nàn. Sử dụng nó quá nhiều, nó phàn nàn.


2
Ngôn ngữ đó không được coi là sử dụng nghiêm túc. Nó được tạo ra để trở thành một ngôn ngữ lập trình rất 'độc đáo', vì vậy nó chứa đầy những thứ (ví dụ: đến từ tâm trí của tôi) không có ý nghĩa gì.
ShdNx

4
Tôi nghĩ rằng nó sẽ rõ ràng, nhưng vâng, tôi biết rằng đó không phải là một ngôn ngữ nghiêm túc.
Alan Pearce

2
Xin lỗi, một số người quá nghiêm trọng ở đây.
Đánh dấu C

1
Mới phát hiện ra ngôn ngữ tuần trước trên Wikipedia và bị thổi phồng về mức độ phổ biến của nó (và vẫn là O_O).
Oliver Weiler

Có một số ngôn ngữ "thách thức" và chúng luôn phổ biến, bởi vì các lập trình viên có xu hướng thực hiện công việc vì yêu thích sự săn đuổi. Cũng rất phổ biến cho các câu hỏi phỏng vấn vì chúng cố tình làm khó, suy nghĩ kích động và khó khăn.
Orbled

7

Mặc dù một số người không đồng ý với người đàn ông hoặc những điều khác nhau mà anh ta nói, rất nhiều JavaScript của Douglas Crockford : Phần tốt về cơ bản là câu hỏi này được áp dụng cho JS. Trong số các khiếu nại của Crockford:

  • Phạm vi toàn cầu theo mặc định cho mọi thứ (DC chỉ ra cách sử dụng hàm / đối tượng làm không gian tên và dấu phân cách phạm vi để sắp xếp thứ này vào.)

  • Các tuyên bố như with, có hành vi thất bại là xác định mọi thứ trong không gian tên toàn cầu. (Gah! Giống như phương châm của JS là nếu bạn thất bại, thì hãy thất bại hết sức có thể !)

  • Hành vi bất ngờ với ==toán tử, về cơ bản đòi hỏi bạn phải luôn sử dụng ===toán tử.

  • Chèn dấu chấm phẩy.

Thực sự rất nhiều JS nên được coi là có hại, thậm chí có thể là toàn bộ ngôn ngữ, nhưng những phần tốt thì quá tốt đến nỗi nó bù đắp cho nó (ít nhất là đối với tôi.)


6

"Không âm thầm" trong Flash Player dưới dạng hành vi mặc định

Ok, không thực sự là một tính năng của ngôn ngữ nhưng vẫn liên quan khá chặt chẽ.

Đột nhiên, ứng dụng Flash / Flex của bạn ngừng hoạt động và không ai có thể cho bạn gợi ý nhỏ nhất về những gì f * đã xảy ra. Không có thông báo lỗi, không stacktrace, không có gì. Chỉ là đột nhiên quá trình chuyển đổi màn hình không xảy ra (hoặc xảy ra theo cách hoàn toàn sai) hoặc các nút không phản ứng với các lần nhấp nữa hoặc các hộp tổ hợp trống thay vì được điền với một số mục.

Chỉ riêng "tính năng" đó chịu trách nhiệm cho một số báo cáo nhún vai và cả đống tóc bạc tôi đã nhận được. -.- Trong khi bật lên một số thông điệp khó hiểu trong khuôn mặt của người dùng cũng không mong muốn, ít nhất nó có thể giúp nhà phát triển khắc phục sự cố.

Nhưng Flash Player khiến bạn bị đâm trong bóng tối, dựa vào mô tả của người dùng (trong khi vấn đề thực sự có thể bắt nguồn từ một vị trí hoàn toàn khác trong mã không liên quan gì đến những gì người dùng đang làm). Chỉ khi bạn sử dụng Trình gỡ lỗi, bạn mới thực sự nhận được cửa sổ bật lên với thông báo lỗi và ngăn xếp.

Tuy nhiên, có thể khá thú vị khi xem phim nhúng flash trên các trang web tin tức nhất định và nhận được thông báo lặp đi lặp lại về các tham chiếu Null từ trình phát SWF được sử dụng. : D


Các ứng dụng iPhone đôi khi cũng bị sập mà không có cảnh báo, trong một số thời điểm kỳ lạ
Ming-Tang

3
Không âm thầm trong bất cứ điều gì là khá tệ hại.

6

Trong C / C ++: Các bài tập đó cũng là các biểu thức COMBINED VỚI các toán tử gán = và so sánh == rất giống nhau. Không phải là một tính năng có hại cho mỗi se, nhưng đó là cách dễ dàng để giới thiệu các lỗi (đôi khi tinh tế) bằng cách vô tình làm cho người vận hành nhầm lẫn.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

... Kết hợp với thực tế là một số nguyên hoặc một con trỏ là một điều kiện hợp lệ.
barjak

5

Các công cụ sửa đổi truy cập trong Java với gói mặc định ngôn ngữ riêng và mặc định quy ước lập trình riêng.


5

Thay thế các biến không xác định bằng một chuỗi rỗng trong shell mà không có bất kỳ cảnh báo nào : rm -rf $nosuchvar/*.


+1 Argh! LOL - mặc định khủng khiếp (và ví dụ thú vị / đáng sợ)
Orbled

@ Điều gì đó giống như ${varname:-/dev/null}có thể là một cách giải quyết ...
duros

Vâng, nó cho thấy sự cần thiết phải luôn luôn kiểm tra sự tồn tại và nội dung biến trước khi sử dụng.
Orble

4

Khả năng quay ngược chiều kim đồng hồ trong LOGO. Wtf, cho phép chỉ xoay theo chiều kim đồng hồ 360 - x.


Vâng, đã được một thời gian kể từ khi tôi sử dụng LOGO. Tại sao điều này có hại?
Mason Wheeler

5
Logo có thể được sử dụng để điều khiển một robot rùa thật, vật lý. Đôi khi bạn muốn con rùa quay một hướng cụ thể, hoặc quay nhiều lần. Ví dụ, có thể bạn đang lập trình nó để thực hiện một số điệu nhảy.
Daniel Cassidy

@Mason, Nó được cho là một trò đùa.
jjnguy

3
Vâng, đặc biệt là trong LOGO Dành cho Đồng hồ.
trực giác

1
Tôi yêu Logo (xem lập trình viên.stackexchange.com/questions/21028 / trộm ) và đó là một ngôn ngữ giảng dạy tuyệt vời, đặc biệt dành cho những người trẻ tuổi. Khi tôi nói 11 và lần đầu tiên sử dụng Logo, hầu hết các lớp của tôi không biết nhiều về hình học, nhưng họ đã nói 90 là một phần tư lượt và biết từ trái sang phải. Vì vậy, nó không phải là một tính năng tiêu cực - giống như lý do tại sao chúng ta không nhân với các đối ứng thay vì có một toán tử chia. Vâng, tôi biết đó là một trò đùa.
Orble

4

Dừng chủ đề từ một chủ đề khác

Trong Java và trong ngôn ngữ khác, bạn có thể dừng một luồng từ một luồng khác một cách tùy ý mà không dành thời gian cho luồng mà bạn dừng để hoàn thành đúng. Khả năng này đã bị phản đối khi xem xét số lượng lớn vấn đề mà nó có thể mang lại trong gần như mọi tình huống.


Mặc dù tôi cho rằng điều này thể gây hại, nhưng đôi khi nó cực kỳ hữu ích (ví dụ: trình gỡ lỗi hỗ trợ các bước đơn và điểm dừng).
Jerry Coffin

1
@Jerry Debugging là một thứ hoàn toàn khác, nó không dừng quá trình, nó tạm dừng nó.
HoLyVieR

thay vì ngược lại, nó dừng chủ đề. Rõ ràng, bạn đang nói về việc giết chết chủ đề, không chỉ dừng lại ở đó. Đó là một chút khó khăn hơn để biện minh ...
Jerry Coffin

Tôi không thấy điều này nhất thiết phải là một tính năng ngôn ngữ mặc dù. Thêm một điều thư viện tiêu chuẩn.
Jason Baker

4

Các biến số trong PHP

Chỉ vì bạn $cankhông có nghĩa là bạn$$should


1
Như thường lệ, Perl ... có sẵn tính năng (có khả năng gây nguy hiểm), có cách thực hành tốt nhất dễ dàng để tắt ( use strict) và cách dễ dàng để bật lại trong chính xác các trường hợp bạn muốn ( no strict 'refs').

1
Tôi chưa bao giờ tìm thấy việc sử dụng để có một tên biến động. Và lần duy nhất tôi đã làm, nó làm cho mã không thể đọc được và một khoảnh khắc WTF vài tháng sau khi tôi xem lại mã.
TheLQ

Mmm, tôi cho rằng các ứng dụng bao gồm siêu lập trình với các biến gói đáng ghét của người khác hoặc bảng ký hiệu (tôi cho là khác biệt nhỏ), tôi cho rằng).

1
@Joe Tôi sẽ thách bạn chỉ cho tôi một ví dụ trong đó các biến biến làm cho giải pháp rõ ràng hơn.
Kendall Hopkins

1
Nhận xét này có ý nghĩa như một trò đùa, xin lỗi tôi đã không làm rõ điều đó, nhưng vì bạn hỏi đây là ví dụ tốt nhất trong đó các biến biến làm cho giải pháp rõ ràng hơn . Tôi sẽ thừa nhận đó là một ví dụ khá xấu.
Joe D

3

Các Withtuyên bố trong Delphi nói đến cái tâm, mặc dù có những trường hợp khi nó có ích.


Một trường hợp tốt khi tôi chuyển một thứ gì đó từ Delphi sang Lazarus và hậu duệ TControl của tôi chứa "với Canvas làm ... Chiều rộng, Chiều cao" tham chiếu các kích thước điều khiển, nhưng Lazarus TCanvas có Độ rộng và Delphi riêng, do đó, điều này dẫn đến mã được biên dịch sai
Maksee

3

Mảng trong AWK bắt đầu từ chỉ số 1 !


2
Mảng trong C và C ++ bắt đầu từ chỉ số 0!
David Thornley

4
Mảng trong lisp bắt đầu từ chỉ số car! : P
Joe D

Ở Lua cũng vậy - không thể tha thứ!
Tobu

2

Trong Perl, bối cảnh vô hướng so với bối cảnh danh sách có thể khó khăn. Nó có một số điểm tốt giúp cho các hoạt động nhất định trở nên thuận tiện, nhưng đôi khi bạn gặp phải điều gì đó khủng khiếp, như thay đổi hoàn toàn ý nghĩa của một toán tử (có khả năng từ một khoảng cách đáng kể trong mã).

sub foo { (1..5) }
my @list = foo();           # (1,2,3,4,5)
my $length = scalar @list;  # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)

Điều đó không đúng.

(Nó phát sinh từ việc cố gắng tạo ra thứ gì đó hoạt động giống như toán tử phạm vi thông thường, vì vậy bạn có thể nói điều gì đó trong một vòng lặp như thế next if /start_regex/ .. /end_regex/).


Con người thật khó hiểu. Điều tồi tệ nhất khi học Perl là cố gắng vượt qua điều đó.
glenatron

Tôi luôn nghĩ rằng bất cứ điều gì cho phép một chức năng trở lại theo nhiều cách là một sự thuận tiện tiện lợi.
Orble

2

Cú pháp nhập tương đối của Python 2.x. Giả sử tôi có một gói x.pluginsbổ sung hỗ trợ cho các thư viện khác x. Và giả sử tôi có một sqlalchemymô-đun x.pluginsđể tôi có thể thêm hỗ trợ sqlalchemy vào x. Bạn nghĩ điều gì sẽ xảy ra nếu tôi thêm dòng sau vào sqlalchemy.py?

import sqlalchemy

Câu trả lời là mô-đun sẽ cố gắng tự nhập. Những gì cú pháp này làm về cơ bản là làm cho không thể nhập gói sqlalchemy toàn cầu thực tế. Python 2.5 đã thêm một cách để xác định rằng đây là một lần nhập tương đối:

from . import sqlalchemy

... nhưng phải đến Python 3, cú pháp đầu tiên mới thực sự bị loại bỏ (mặc dù nó có thể bị vô hiệu hóa trong Python 2.6+ với from __future__ import absolute_import).


1

sun.misc.unsafe là sở thích của tôi mọi lúc; bộ sưu tập "chúng tôi cần điều này để thực hiện mọi thứ, nhưng thực sự, thực sự không nghĩ rằng bạn nên sử dụng nó."


7
Mỗi ngôn ngữ tốt nên có một gói không an toàn trong thư viện tiêu chuẩn. Nhập gói này cho thấy rõ ý định của bạn làm những việc không quan trọng ở mức độ thấp. Các lựa chọn thay thế là: 1- Có các tính năng không an toàn trong chính ngôn ngữ (ví dụ C ++) và 2- Phải sử dụng một ngôn ngữ khác như C để thực hiện những việc ở cấp độ thấp (ví dụ Python và Ruby). Cách tiếp cận gói không an toàn có vẻ tốt hơn đối với tôi.
imgx64

1

FORTRAN khối chung. Nếu bạn mắc một lỗi đơn giản, một phần của ứng dụng có thể ghi đè lên phần chung của phần khác.

FORTRAN được gán câu lệnh goto / câu lệnh thay đổi COBOL. Mã tự sửa đổi. Nguy hiểm, cảnh báo, quái vật bay spaghetti !!


FORTRAN không có câu lệnh ALTER. FORTRAN đã có tuyên bố ASSIGN, với GOTO được chỉ định. COBOL có tuyên bố ALTER, phục vụ mục đích tương tự.
John R. Strohm

@ John - cảm ơn. Trí nhớ về gán / thay đổi của tôi rất mờ ... không phải vì tôi được dạy không bao giờ sử dụng chúng.
Stephen C

1

Định hướng đối tượng (từ tất cả các ngôn ngữ gõ tĩnh). Tôi sẽ đặt cược tính năng này có, và sẽ tiếp tục, chi phí bao la hơn con trỏ null. Định hướng đối tượng chỉ tốt trong một ngôn ngữ truyền thông điệp động . Vì vậy, nó cũng nên được loại bỏ khỏi các ngôn ngữ động như Python (vì nó không sử dụng chuyển tin nhắn mà gọi chương trình con thông thường).


Python hỗ trợ (cho tất cả ý định và mục đích) thông điệp của smalltalk thông qua thành ngữ. Nó không được đặt tên theo cách đó. Thứ hai, tôi nghĩ rằng ít nhất một chút tranh cãi khi gọi một tính năng ngôn ngữ phổ biến như vậy có hại.
Jason Baker

Định hướng đối tượng vẫn cải thiện việc tái sử dụng mã và đóng gói mã / dữ liệu. Bất kể việc sử dụng tĩnh / động của tính năng.
Orbled

@ Tổ chức: So với cái gì? Theo tôi, các ngôn ngữ lập trình chức năng có khả năng tái sử dụng mã cao hơn và tôi nghĩ hệ thống mô-đun của Haskell khá tốt cho việc đóng gói mã / dữ liệu.
LennyProgrammer

@ Lenny222 So với chương trình bắt buộc tiêu chuẩn. Tôi cũng thích cách tiếp cận chức năng, Haskell là ngôn ngữ ưa thích của tôi.
Orble

@Jason Baker: chắc chắn là nó gây tranh cãi, nhưng quá phổ biến là chính xác những gì làm cho nó rất có hại! OP đã hỏi ý kiến ​​của tôi và tôi đã đưa ra. Chỉ vì một loạt Lemmings nhảy lên một vách đá không làm cho hành vi trở nên lành mạnh. Trong trường hợp này, OOP đã được chứng minh về mặt toán học không hoạt động và mô hình chính xác được chấp nhận tốt: lý thuyết thể loại là cách để thể hiện sự trừu tượng (thực tế là lý thuyết trừu tượng)
Yttrill

1

magic_quotestrong PHP .

Các nhà phát triển chưa có kinh nghiệm hoặc dựa vào nó được kích hoạt và do đó giả sử tất cả đầu vào của người dùng được thoát để sử dụng trong truy vấn SQL hoặc dựa vào nó bị vô hiệu hóa và do đó luôn thoát khỏi đầu vào của họ.

Khi giả sử nó được kích hoạt và sau đó chạy mã trên một hệ thống mà ở đó nó không mở ra các lỗ hổng SQL rộng.

Khi giả sử nó bị vô hiệu hóa và không, nó sẽ dẫn đến các dấu gạch chéo ngược thực sự được lưu trữ trong DB, gây ra các chuỗi xấu / không chính xác.

Cũng không có cách cực kỳ đơn giản để xử lý cả hai trường hợp - bạn cần kiểm tra xem nó có được kích hoạt get_magic_quotes_gpc()hay không và sau đó áp dụng stripslashes()cho tất cả các giá trị trong $_*mảng - vì array_mapkhông đệ quy nên bạn cần một hàm tùy chỉnh cho việc này.


Hoặc bạn chỉ có thể sử dụng các truy vấn tham số.
Pieter B

Thậm chí sau đó bạn sẽ nhận được dấu gạch chéo ngược nếu trích dẫn ma thuật được bật và bạn không mong đợi nó.
ThiefMaster

-3

Tính năng ngôn ngữ cho phép các lập trình viên viết mã không bị lỗi hoặc vô nghĩa.


1
Và làm thế nào để khắc phục điều này?
Maniero

1
@bigown: bằng cách triển khai tính năng bình luận hoặc chết: D.
tia

3
Đó gọi là Lập trình biết chữ. vi.wikipedia.org/wiki/Literate_programming
Barry Brown

2
Đó không phải là một tính năng, nhưng nó là một lỗi cực kỳ nổi tiếng trong giao diện người dùng, hầu hết mọi người đều biết đến nó bằng tên Latin: Homo Sapiens.
Joe D

-3

đi ra ngoài một chút trên một chi ở đây - các hàm void. một hàm luôn luôn làm một cái gì đó, do đó nó sẽ trả về kết quả hoặc một số thông tin khác liên quan đến thành công hay thất bại của nó.


3
Pascal có các thủ tục (không có giá trị trả về) cũng như các hàm (giá trị trả về).
Jon Onstott

Chức năng luôn làm điều gì đó (cũng thường, chức năng giữ chỗ ai?) , Nhưng thường không cần phải nói cho ai biết về nó.
Orble

-4

ĐIỂM CƠ BẢN ...


7
ĐIỂM thật tuyệt vời.
Shog9

2
Trong những ngày đầu, chọc là cách hợp lý duy nhất bạn có thể đạt được những điều cơ bản nhất định. Âm nhạc trên Apple] [xuất hiện trong tâm trí ...
Bill Bill

2
Bạn không thể làm gì nhiều mà không ĐIỂM trên một chiếcore 64, nếu tôi nhớ chính xác.
MetalMikester

1
Đừng quên PEEK, cả hai đều cần thiết.
Orble

-5

Tôi phải nói là thu gom rác. Nó không loại bỏ nhu cầu suy nghĩ về quản lý bộ nhớ, nhưng nó loại bỏ nhận thức về nhu cầu suy nghĩ về quản lý bộ nhớ, điều này thường loại bỏ suy nghĩ thực tế, và sau đó bạn nhận được rất nhiều tài nguyên khổng lồ và không biết tại sao. Đặc biệt là khi hành vi của các thế hệ GC hiện đại có thể được mô tả mà không có quá nhiều sự cường điệu như "một rò rỉ bộ nhớ lớn theo thiết kế".


2
Nếu bạn có tài liệu tham khảo ngồi xung quanh trong một số bộ sưu tập ở đâu đó, bạn có vấn đề khác.
Chinmay Kanchi

2
Đó là lý do tại sao các ngôn ngữ gc'ed có tài liệu tham khảo yếu :)
Chinmay Kanchi

4
Trong khi GC chắc chắn có cả điểm mạnh và điểm yếu, tôi phải nói rằng Mason đúng hơn rất nhiều so với sai về điều này. Trong thực tế, tôi đã nhìn thấy những người sử dụng GC dành nhiều thêm thời gian về quản lý bộ nhớ bởi vì họ đã kết thúc cố gắng để hack những thứ sau khi thực tế thay vì lên kế hoạch cho nó lên phía trước. GC cũng thường ngăn chặn sự phá hủy xác định, dẫn đến việc phải làm thêm việc quản lý tất cả các tài nguyên khác ngoài bộ nhớ.
Jerry Coffin

3
@ChaosPandion: Tôi có thực sự là một kẻ ngốc nếu tôi nghĩ rằng, trên một máy đa nhiệm hiện đại, để giữ phân trang khỏi hiệu năng hệ thống của bạn, bộ nhớ nên được giải phóng càng sớm càng tốt? Không có GC nào từng xoay sở để đạt được kết quả đó, và trên thực tế, công cụ thu gom rác thế hệ, được cho là giống tốt nhất, hiện đại nhất, ngược lại: để có hiệu suất tốt nhất, nó phải phát hành trí nhớ càng muộn càng tốt. Tôi không thấy rằng công cụ phù hợp cho bất kỳ công việc nào, không phải khi nó làm chậm các chương trình khác của tôi. Tôi có phải là một kẻ ngốc cho điều đó?
Mason Wheeler

2
@Barry: Nó mang tính quyết định trong chương trình. Nếu tôi hoàn thành với khối bộ nhớ 5 KB, sau đó yêu cầu thêm 5 KB nữa, điều gì xảy ra? Trong một hệ thống thu gom rác, nó cần phải yêu cầu một khối 5 KB mới, mặc dù có một khối hoàn toàn tốt không được sử dụng, trừ khi GC đã chạy tạm thời, trong trường hợp đó bạn có thể tái chế khối cũ. Với malloc và miễn phí, bạn sẽ luôn có thể tái chế khối cũ. Nhân số này với vài trăm nghìn và nó trở thành một vấn đề thực sự.
Mason Wheeler

-5

C, và chắc chắn là C ++: Số học con trỏ. Cho phép mọi người chuyển đổi số nguyên thành địa chỉ bộ nhớ đang yêu cầu sự cố.

Và thậm chí có thể truy cập thô vào con trỏ hoàn toàn?

Trong C ++, bạn có các tài liệu tham khảo làm cho con trỏ gần như hoàn toàn không cần thiết. Đối với các trường hợp còn lại con trỏ thông minh nên được coi là bắt buộc.

Java cũng chứng minh rằng bạn có thể tạo một ngôn ngữ lập trình sử dụng các con trỏ mà không cho phép mọi người truy cập vào chính giá trị con trỏ.

Ngoài null... nhưng đó là một câu chuyện khác.


5
Con trỏ, trong khi khó sử dụng đúng cách, đôi khi rất cần thiết cho một số lượng lớn các hoạt động bộ nhớ hiệu quả.
Hóa đơn

1
Thật. Nhưng theo tôi, việc cho phép mọi người chuyển đổi số nguyên thành tham chiếu bộ nhớ hoặc thêm số vào địa chỉ bộ nhớ hầu như có hại trong những ngày này theo quan điểm của tôi. Trong C ++, bạn có các tài liệu tham khảo như một sự thay thế hoàn toàn tốt và các con trỏ / con trỏ tự động thông minh khi bạn thực sự cần nó là một con trỏ.
Asgeir S. Nilsen

4
Câu trả lời này chỉ hợp lệ nếu bạn đang làm việc trên một ngăn xếp phần mềm được xây dựng để ẩn con trỏ. Trong tất cả các trường hợp khác, câu trả lời này là sai.
Paul Nathan

3
Một số ngôn ngữ lập trình cần phải có sẵn con trỏ để bạn có thể viết tất cả các hệ điều hành và máy ảo cho các ngôn ngữ lập trình khác.

2
-1. Có một lý do bạn cần số học ptr: Lặp lại một điểm nhanh hơn so với lập chỉ mục. for(int i=0;i<SIZE;++i) ++arr[i]là chậm hơn so với for(int*i=arr;i<arr+SIZE;++i)*i++. Tất cả java quản lý để chứng minh là bạn cần con trỏ, hoặc bạn chưa bao giờ nhìn vào sun.misc.Unsafe? Nếu bạn không cần con trỏ, vui lòng giải thích cách viết hàm hoán đổi chung bằng Java. (ví dụ: int a = 1, b = 2; hoán đổi (a, b); khẳng định (a == 2 && b == 1);). Chưa kể tất cả các vấn đề trong c / c ++ bạn sẽ gặp phải nếu bạn HAD sử dụng tài liệu tham khảo. Làm thế nào bạn sẽ gọi một hàm ảo trên một con trỏ có cấu trúc mờ đục?
KitsuneYMG
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.