Nhập môn lập trình Java
Tóm tắt: Ngôn ngữ Java, và nền tảng Java luôn phát triển là một cuộc cách mạng
trong lập trình. Mục tiêu của hướng dẫn này là giới thiệu cho bạn cú pháp của Java
mà bạn hầu như chắc chắn sẽ gặp trên con đường nghề nghiệp và cho bạn thấy
những thành tố đặc thù (idioms) của nó giúp bạn tránh khỏi những rắc rối. Theo
bước Roy Miller, chuyên gia Java khi ông hướng dẫn bạn những điểm cốt yếu của
lập trình Java, bao gồm mẫu hình hướng đối tượng (OPP) và cách thức áp dụng nó
vào lập trình Java; cú pháp của ngôn ngữ Java và cách sử dụng; tạo ra đối tượng
và thêm các hành vi, làm việc với các sưu tập (collections), xử lý lỗi; các mẹo để
viết mã lệnh tốt hơn.
Về tài liệu này
Tài liệu đề cập đến những gì?
Hướng dẫn này giới thiệu cho bạn phương pháp lập trình hướng đối tượng (OOP)
bằng ngôn ngữ Java. Nền tảng Java là một chủ đề rộng lớn, bởi vậy chúng ta
không thể đề cập đến tất cả trong tài liệu này, nhưng chúng ta sẽ trình bày đủ để
bạn có thể khởi đầu. Tài liệu tiếp theo sẽ cung cấp thêm các thông tin và hướng
dẫn bạn trong nỗ lực lập trình bằng Java.
rình của tôi không chạy, nếu tôi gặp phải một phương thức có tên là a() thì tôi chỉ muốn nện cho ai đó một trận. Hãy dành thêm vài phút để chọn một cái tên rất gợi tả; nếu có thể, bạn hãy cân nhắc việc đặt tên cho các phương thức theo cách thức sao cho mã lệnh của bạn đọc ra giống như lời nói thông thường vậy, thậm chí nếu điều này có nghĩa là cần thêm các phương thức phụ trợ để làm được việc đó. Ví dụ, hãy xem xét việc thêm vào một phương thức phụ trợ khiến cho đoạn mã lệnh này thêm dễ đọc hơn: if (myAdult.getWallet().isEmpty()) { do something } Phương thức isEmpty() của ArrayList tự nó rất có ích, nhưng điều kiện logic trong câu lệnh if của chúng ta có thể được lợi từ phương thức hasMoney() của Adult như sau: public boolean hasMoney() { return !getWallet().isEmpty(); } Sau đây là câu lệnh if đọc giống lời nói thông thường hơn: if (myAdult.hasMoney()) { do something } Kỹ thuật này đơn giản và có lẽ là bình thường trong trường hợp này, nhưng nó lại rất hữu hiệu khi mã lệnh trở nên phức tạp hơn. Giữ cho số lượng các lớp ít nhất Một trong những nguyên tắc chủ đạo để có được thiết kế đơn giản trong lập trình đỉnh cao (XP) là đạt được mục tiêu với ít lớp nhất có thể, nhưng không ít hơn. Nếu bạn cần một lớp khác, chắc chắn là nên thêm nó vào. Nếu thêm lớp khác làm cho mã lệnh của bạn đơn giản hơn hay làm cho bạn diễn dịch ý định của mình dễ dàng hơn thì hãy cứ tiếp tục thêm lớp vào. Nhưng chẳng có lý do gì để thêm các lớp chỉ để có chúng mà thôi. Thường khi bắt đầu dự án bạn có ít lớp hơn là khi hoàn thành xong xuôi, dĩ nhiên, nhưng cũng thường thì dễ tái cấu trúc mã lệnh của bạn thành nhiều lớp hơn là tích hợp chúng lại. Nếu bạn có một lớp có rất nhiều phương thức, phân tích xem liệu có phải có một lớp khác mắc bẫy vào đây và đang đợi được tách ra hay không. Nếu có, hãy tạo ra một đối tượng mới. Trong hầu hết các dự án Java của tôi, không ai ngại xây dựng các lớp nhưng chúng tôi cũng luôn cố gắng giảm số lượng các lớp mà không làm cho ý định của mình kém tường minh. Hãy giữ cho số lượng các chú thích ít nhất Tôi thường viết các chú thích thừa trong mã lệnh của mình. Đọc chúng hệt như đọc cả một cuốn sách. Bây giờ tôi đã khôn ngoan hơn chút ít. Tất cả các chương trình học tập về khoa học máy tính, tất cả các cuốn sách dạy lập trình và rất nhiều lập trình viên tôi quen biết đều khuyên bạn chú thích cho các mã lệnh. Trong một vài trường hợp, các chú thích thật sự có ích. Nhưng trong một số trường hợp khác thì chính chúng lại làm cho việc bảo trì mã lệnh khó thêm. Thử nghĩ xem bạn phải làm gì khi bạn thay đổi mã lệnh. Có chú thích ở đấy không? Nếu có, tốt hơn là bạn phải thay đổi cả chú thích hoặc là nó sẽ trở nên lỗi thời kinh khủng, và thời gian trôi đi, thậm chí nó chả diễn tả gì mã lệnh cả. Theo kinh nghiệm của tôi thì nó chỉ tăng gấp đôi thời gian bảo trì của bạn mà thôi. Quy tắc chủ đạo của tôi là: Nếu mã lệnh khó đọc và khó hiểu đến nỗi cần phải có chú thích thì tôi cần làm cho nó sáng sủa hơn đủ để không cần chú thích nữa. Có thể là nó quá dài hoặc làm quá nhiều việc. Nếu thế, phải làm cho nó trở nên đơn giản hơn. Có thể nó quá khó hiểu. Nếu thế, tôi sẽ bổ sung thêm các phương thức phụ trợ để làm nó dễ hiểu hơn. Thực tế, trong 3 năm lập trình Java với các thành viên trong đội, tôi có thể đếm số lượng chú thích tôi đã viết trên đầu ngón tay và ngón chân. Hãy làm mã lệnh của bạn sáng sủa hơn! Nếu bạn cần một bức tranh tổng thể về hệ thống, hoặc một thành phần cụ thể nào đó làm cái gì, hãy viết tài liệu ngắn gọn để mô tả nó. Những chú thích dài dòng thường khó bảo trì, thường chúng không diễn giải ý định của bạn tốt bằng một phương thức được viết chuẩn, nhỏ gọn, và sẽ nhanh chóng trở nên lỗi thời. Đừng phụ thuộc quá nhiều vào các chú thích. Hãy dùng một phong cách nhất quán Viết mã lệnh theo phong cách gì thực sự là vấn đề về sự cần thiết và cái có thể chấp nhận được trong môi trường của bạn là gì. Tôi thậm chí không biết đến một phong cách mà tôi có thể gọi là “tiêu biểu”. Nó là chuyện sở thích cá nhân. Ví dụ, những dòng lệnh sau có thể làm tôi giật nảy mình cho đến khi tôi biến đổi đi: public void myMethod() { if (this.a == this.b) { statements } } Vì sao điều đó lại làm tôi băn khoăn? Vì cá nhân tôi không ưa kiểu viết mã lệnh thêm cả loạt dòng mới, mà theo ý kiến của tôi, không cần thiết. Trình biên dịch Java ghi nhận những dòng mã lệnh sau đây cũng giống như vậy, và tôi tiết kiệm được vài dòng: public void myMethod() { if (this.a == this.b) statements } Không có cách viết nào là “đúng” hay là “sai”. Chỉ đơn giản là nó ngắn hơn cách kia. Vậy điều gì xảy ra khi tôi viết mã lệnh với những người thích cách đầu tiên hơn ? Chúng tôi trao đổi về nó, chọn ra kiểu chúng tôi sẽ dùng và sau đó thì trung thành với nó. Chỉ có một quy tắc nghiêm ngặt là hãy nhất quán. Nếu những người tham gia thực hiện một dự án áp dụng các phong cách khác nhau, việc đọc mã lệnh sẽ khó khăn. Hãy chọn một kiểu thôi và đừng thay đổi nữa. Tránh dùng lệnh switch Một vài lập trình viên Java thích dùng lệnh switch. Tôi thì nghĩ lệnh đó cũng hay, nhưng sau đó nhận ra rằng switch thực ra chỉ là một loạt lệnh if, và như thế có nghĩa là logic điều kiện sẽ xuất hiện ở nhiều nơi trong mã lệnh của tôi. Đó là sự lặp lại mã lệnh, và đấy là cái không chấp nhận được. Tại sao? Bởi vì có những mã lệnh giống nhau tại nhiều vị trí có thể khiến cho mã lệnh khó thay đổi. Nếu tôi có cùng lệnh switch ở tại 3 nơi và tôi muốn thay đổi cách xử lý một trường hợp cụ thể thì tôi phải thay đổi 3 đoạn mã lệnh. Bây giờ, nếu như bạn có thể tái cấu trúc mã lệnh sao cho chỉ còn có một lệnh switch thì sao? Tuyệt vời! Tôi không tin có bất kỳ chuyện tệ hại gì khi dùng nó. Trong một vài trường hợp, dùng switch lại khiến mã lệnh sáng tỏ hơn là nhiều lệnh if lồng nhau. Nhưng nếu bạn thấy nó xuất hiện ở nhiều nơi có vấn đề thì bạn nên sửa đi. Cách dễ nhất để khỏi vấp phải vấn đề này là tránh dùng lệnh switch trừ khi nó là công cụ tốt nhất cho công việc đó. Theo kinh nghiệm của tôi thì điều này rất hiếm khi xảy ra. Hãy để là public Tôi để dành lời khuyến cáo gây nhiều tranh cãi nhất đến phút cuối cùng. Hãy chuẩn bị tinh thần nào và hít thở thật sâu. Tôi tin bạn sẽ sai lầm khi đặt toàn bộ các phương thức của bạn ở chế độ truy nhập là public. Các biến cá thể đặt ở chế độ protected. Dĩ nhiên, nhiều lập trình viên chuyên nghiệp sẽ rùng mình khi nghĩ đến điều đó vì nếu mọi thứ đều là công cộng thì ai cũng có thể biến đổi chúng được, có thể bằng cả những cách bất hợp pháp. Trong một thế giới mà mọi thứ đều có thể truy cập công cộng, bạn phải phụ thuộc vào tính nguyên tắc của người lập trình trong việc đảm bảo rằng mọi người không thể truy nhập vào những thứ mà họ không nên truy nhập khi họ không được phép. Nhưng trong thực tế lập trình, ít có điều gì gây phiền toái hơn là muốn truy cập một biến hay một phương thức mà bạn không nhìn thấy được. Nếu bạn hạn chế truy cập những thứ trong mã lệnh và bạn coi rằng những người khác sẽ không truy cập được, thì có lẽ bạn thực sự là đấng toàn năng. Đó là một giả định nguy hiểm trong mọi thời điểm. Nỗi phiền toái này thường lộ ra khi bạn dùng mã lệnh của người khác. Bạn có thể thấy một phương thức thực hiện chính xác những gì bạn muốn làm, nhưng nó lại không cho phép truy cập công cộng. Đôi khi có lý do chính đáng để làm việc đó và việc hạn chế các truy nhập là có ý nghĩa. Thế nhưng, đôi khi lý do duy nhất để chế độ truy cập không là public là những người viết mã lệnh đã nghĩ rằng “Chả bao giờ có ai cần truy nhập vào đây cả”. Hoặc có thể họ đã nghĩ “Chẳng ai sẽ cần truy nhập vì…” và tiếp theo, không có một lý do đủ vững chắc. Nhiều khi người ta sử dụng chế độ private vì nó có sẵn đó. Đừng làm vậy. Hãy để các phương thức là public và các biến là protected cho đến khi bạn có lý do hợp lý để hạn chế truy nhập. Theo dấu chân của Fowler Bây giờ bạn đã biết cách làm thế nào để viết mã lệnh Java tốt và giữ gìn cho nó chuẩn mực. Cuốn sách hay nhất trong ngành công nghiệp phần mềm là cuốn “Tái cấu trúc” của Martin Fowler (xem Các tài nguyên). Nó thậm chí còn rất hài hước nữa. Tái cấu trúc có nghĩa là thay đổi thiết kế của mã lệnh hiện có mà không làm biến đổi kết quả của nó. Fowler nói về các “mùi mã lệnh” đang xin được tái cấu trúc, và đi sâu vào chi tiết các kỹ thuật khác nhau (hoặc các kiểu tái cấu trúc khác nhau) để khắc phục chúng. Theo quan điểm của tôi, việc tái cấu trúc và khả năng viết mã lệnh kiểm thử đi trước (code test-first) (xem Các tài nguyên là những kỹ năng quan trọng nhất mà các lập trình viên mới vào nghề cần học. Nếu mọi người đã thạo cả hai, nó sẽ cách mạng hóa ngành công nghiệp này. Nếu bạn trở nên thành thạo ở cả hai kỹ năng, sẽ rất dễ kiếm việc làm, vì bạn sẽ có thể làm ra kết quả tốt hơn so với đa số người tìm việc. Việc viết mã lệnh Java tương đối đơn giản. Viết mã lệnh Java “tốt” lại là mẹo mực. Bạn hãy tập trung để trở thành những người lành nghề. Tổng kết Trong tài liệu này, bạn đã học về lập trình hướng đối tượng, khám phá cú pháp của Java để giúp bạn tạo ra các đối tượng hữu dụng, và hiểu biết về một IDE giúp bạn kiểm soát môi trường phát triển của mình. Bạn có thể tạo ra các đối tượng có khả năng thực hiện tốt một số việc, mặc dù dĩ nhiên là không phải tất cả mọi việc mà bạn có thể tưởng tượng ra. Nhưng bạn có thể mở rộng hiểu biết của mình theo nhiều cách, bao gồm cả việc nghiên cứu kỹ về Java API và khám phá các khả năng khác của ngôn ngữ Java qua các bài hướng dấn khác của developerWorks. Hãy xem phần Các tài nguyên để tìm tài liệu về tất cả các vấn đề này. Ngôn ngữ Java chắc chắn không là hoàn hảo; mọi ngôn ngữ đều có các thói tật và mọi các lập trình viên đều có ngôn ngữ ưa thích của mình. Tuy nhiên, nền tảng Java là công cụ tốt có thể giúp bạn viết nên các chương trình chuyên nghiệp chuẩn mực ở mức yêu cầu cao.
File đính kèm:
- Nhập môn lập trình Java.pdf