Dựa vào khởi tạo trường mặc định - là phong cách lập trình xấu? [đóng cửa]


20

Tôi đã được cung cấp một liên kết đến tài liệu chính thức của nhà tiên tri: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

người ta nói:

Giá trị mặc định

Không phải lúc nào cũng cần gán giá trị khi một trường được khai báo. Các trường được khai báo nhưng không được khởi tạo sẽ được trình biên dịch đặt thành mặc định hợp lý. Nói chung, mặc định này sẽ là 0 hoặc null, tùy thuộc vào loại dữ liệu. Tuy nhiên, dựa vào các giá trị mặc định như vậy, thường được coi là phong cách lập trình xấu.

Tôi muốn nhấn mạnh phần này:

Tuy nhiên, dựa vào các giá trị mặc định như vậy, thường được coi là phong cách lập trình xấu.

Nhưng, ôi chàng trai, đây là, tôi sẽ nói, một phần cơ bản của đặc tả ngôn ngữ biết rằng các biến thể hiện có giá trị mặc định. Tại sao trên trái đất đây là một thực tiễn lập trình xấu nếu nó được sử dụng rộng rãi ngay cả trong mã nguồn của thư viện Java SE?


5
Huh. Tôi không bao giờ biết rằng tuyên bố là trong đó. Tôi thực sự coi đó là thực hành tốt để dựa vào họ. private int count = 0;là mã không làm gì cả, và mã không có gì là lộn xộn. Nó giống như nhập các lớp từ java.lang hoặc khai báo một lớp với extends Object.
VGR

2
... Hoặc có một public abstractphương thức trong một giao diện.
mumpitz

1
Có gì sai với trừu tượng công cộng?
John Keates

1
Một mảnh của câu đố có thể đến từ C ++. Đó là một ngôn ngữ phổ biến và việc xử lý khởi tạo mặc định so với khởi tạo bằng 0 là một lỗi liên tục. Trong C ++, việc dựa vào các mặc định trong tất cả các trường hợp ngoại trừ những trường hợp đặc biệt nhất là một ý tưởng tồi. Điều đó có thể đã bị rò rỉ vào Java một cách văn hóa.
Cort Ammon

@JohnKeates - Java của tôi hơi thô, nhưng privatecác phương thức trong giao diện sẽ không có ý nghĩa và abstractđược ngụ ý.
Scott Smith

Câu trả lời:


6

Văn bản được trích dẫn là:

"Tuy nhiên, dựa vào các giá trị mặc định như vậy, thường được coi là phong cách lập trình xấu."

Một cách hoài nghi: "thường được coi là như vậy" thường là một cách để nói rằng tác giả đã không cố gắng tìm một nguồn có thẩm quyền cho tuyên bố được trình bày.

Trong trường hợp này, khẳng định rõ ràng là nghi vấn. Bằng chứng: 5 trên 5 Hướng dẫn về Phong cách Java được lấy mẫu KHÔNG nói bất cứ điều gì về việc bạn nên hay nên dựa vào các giá trị mặc định:

. )


ĐỒNG Ý. Vì vậy, nó thực sự hỗ trợ khả năng đọc mã Java?

Đây là tranh cãi.

Một mặt, một lập trình viên Java mới làm quen với việc khởi tạo mặc định có thể gặp khó khăn về việc các số 0 hoặc null đến từ đâu. Nhưng nếu họ bận tâm tìm kiếm một khởi tạo rõ ràng và tìm thấy không có một khởi tạo nào, điều đó đủ để khiến họ đọc một hướng dẫn hoặc cuốn sách để tìm hiểu về khởi tạo mặc định. (Bạn sẽ hy vọng!)

Mặt khác, chúng ta thường không mong đợi các lập trình viên Java mới làm quen đang duy trì các cơ sở mã sản xuất. Đối với một lập trình viên Java có kinh nghiệm, việc khởi tạo dự phòng không cải thiện khả năng đọc. Đó là (tốt nhất) tiếng ồn.

Theo tôi, điều duy nhất đạt được khi khởi tạo dự phòng của một trường là báo hiệu cho người đọc mã tương lai của bạn rằng bạn đã nghĩ về giá trị ban đầu. (Như @GhostCat bày tỏ, việc khởi tạo mặc định không truyền đạt ý định.)

Nhưng ngược lại, nếu tôi là người đọc đó, tôi sẽ không nhất thiết tin tưởng vào suy nghĩ của tác giả mã. Vì vậy, giá trị của "tín hiệu" này cũng có vấn đề.


Còn độ tin cậy thì sao?

Trong Java, nó không có sự khác biệt. JLS quy định cụ thể mà khởi tạo mặc định không xảy ra đối với các lĩnh vực. Và ngược lại, đối với các biến cục bộ, đó là lỗi biên dịch khi cố gắng sử dụng một biến chưa được khởi tạo chắc chắn.

Nói tóm lại, hành vi thời gian chạy của một biến không được khởi tạo rõ ràng là hoàn toàn có thể dự đoán được.

Ngược lại trong các ngôn ngữ như C hoặc C ++, nơi các biến có thể không được khởi tạo, hành vi không được chỉ định và có thể dẫn đến sự cố và sự khác biệt trong hành vi trên các nền tảng khác nhau. Trường hợp luôn luôn khởi tạo các biến rõ ràng mạnh hơn ở đây.


Hiệu suất thì sao?

Nó sẽ không làm cho sự khác biệt. Trình biên dịch JIT có thể coi việc khởi tạo dự phòng và khởi tạo mặc định là như nhau.


19

Đơn giản: dựa vào các giá trị mặc định không truyền đạt ý định.

Bạn có thực sự muốn trường đó bắt đầu bằng 0 hay bạn quên gán giá trị?!

Và tất nhiên, một tham chiếu null là một nửa trong hai điều bạn cần để chạy vào một ngoại lệ nullpulum.

Cuối cùng, sử dụng mặc định ngụ ý rằng bạn có các trường không phải là cuối cùng. Mà bạn tránh nơi có thể.

Đối số duy nhất là: tại sao lại viết ra những thứ mà bạn không phải làm? Nhưng tôi nghĩ rằng nhược điểm được liệt kê là kèn, do đó, gán 0 cho một trường rõ ràng tốt hơn là để nó cho trình biên dịch.


3
tức là re: không truyền đạt ý định - Điều gì sẽ xảy ra nếu "Manny the duy trì" đang xem mã của bạn và không biết mặc định cho một loại dữ liệu cụ thể là gì. Anh ta giả sử nó là 0 khi nó thực sự là NULL và đó là toàn bộ lỗi trong kiểm tra === (hoặc bất cứ điều gì kiểm tra đẳng thức tương đương cho giá trị & loại là trong java, bằng ()?). Hàng giờ tìm kiếm (đối với một lập trình viên thiếu kinh nghiệm) có thể là kết quả của một cái gì đó rất đơn giản. PS cố gắng chơi người ủng hộ của quỷ. Tôi nói sử dụng mặc định cả ngày (mặc dù tôi không bao giờ làm) và nhận được những người thông minh hơn (hoặc ít nhất là chú ý đến chi tiết cao hơn) để duy trì mã của bạn.
TCooper

@TCooper khi mannie người bảo trì biết rất ít về Java, thì anh ta không có kinh doanh nào chạm vào mã Java trong thế giới thực. Nhưng tôi đồng ý với khái niệm cơ bản. Nó làm cho mọi thứ khó khăn hơn cho người mới.
GhostCat chào mừng Monica C.

12

Tại sao trên trái đất đây là một thực hành lập trình xấu

Ý tưởng là nếu bạn dựa vào một giá trị mặc định, thì mọi người sẽ không rõ ràng ngay lập tức nếu bạn cố tình để nó làm giá trị mặc định hoặc đơn giản là bạn quên không gán nó.

... nếu nó được sử dụng rộng rãi ngay cả trong mã nguồn của thư viện Java SE ??

Mã nguồn Java không thực sự là thứ bạn nên dựa vào như một ví dụ về thực hành mã hóa mẫu mực. Có nhiều trường hợp các quy tắc như vậy bị vi phạm (đôi khi cố ý cải thiện hiệu suất nhỏ và đôi khi vô tình hoặc vì phong cách được chấp nhận đã thay đổi qua nhiều năm.)


2
Điều này có lẽ đúng, mặc dù tôi không đồng ý với nó.
VGR

3
@VGR Nhiều như tôi có xu hướng đồng ý với tuyên bố rằng việc dựa vào các giá trị mặc định là tối ưu phụ, tôi đã cẩn thận để diễn đạt nó theo cách trung lập vì lý do đó. Chất lượng mã là chủ quan và tôi nhận thức rõ rằng đây không phải là một quan điểm phổ biến.
Michael Berry
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.