Học kì 3 này mình bắt đầu học môn Toán Tin học (hay còn gọi là Toán rời rạc, Discrete Math), và theo mình thì nó là một môn khá thú vị, thú vị không phải vì bản thân nó mà vì người dạy nó, thầy Nguyễn Văn Minh Mẫn. Thầy là người đầu tiên ở cái trường BK này gây ra cho mình cảm giác hào hứng với môn học được dạy, hoàn toàn khác hẳn với những môn khác (đặc biệt là môn Kỹ Thuật Lập Trình, quá thất vọng vì người ta có thể dạy nó dở như vậy :( ). Ba tiết Toán Tin ngày hôm qua, mình được học về các phép chứng minh, trong đó có phương pháp chứng minh tiên đề.
Nói ngắn gọn thì quá trình chứng minh trong phương pháp tiên đề là quá trình đi từ một cái đúng, bằng phương pháp suy luận đúng đi đến cái cần chứng minh. Ví dụ: để chứng minh A đúng, ta đi từ một điều đã biết là đúng B, bằng phương pháp suy luận đúng để đi đến A (nghĩa là làm sao để B => A là đúng), từ đó kết luận A cũng đúng luôn. Tuy nhiên, làm sao chúng ta có thể khẳng định B đúng? Phải chứng minh, tất nhiên. Chúng ta lại bắt đầu đi từ một cái C đã biết là đúng để chứng minh B đúng tương tự như trên (chỉ ra C => B là đúng). Rồi, vậy làm sao biết C có thật sự đúng hay không? Tất nhiên rồi, phải chứng minh. Lại bắt đầu từ một cái đúng đã biết D nào đó. Cứ tiếp tục như vậy i-) . Theo bạn, quá trình này còn tiếp tục tới bao giờ, vô hạn ư, không thể được bởi vì bảng chữ cái cũng có giới hạn thôi :D . Cái quá trình trên chắc chắn phải có giới hạn, có điểm dừng, có nghĩa là có một mệnh đề Z nào đó mà chân trị đúng của nó là hiển nhiên, là không cần chứng minh (hay không thể chứng minh?). Mệnh đề Z được gọi là tiên đề, là cái để chứng minh những mệnh đề còn lại, Z => X => ... => C => B => A => ...
Theo bạn, có bao nhiêu đường thẳng qua 2 điểm bất kỳ không trùng nhau? Một, tất nhiên rồi. Bạn có thể trả lời như vậy một cách tức thì, không một chút đắn đo. Vâng, bạn hoàn toàn đúng, điều đó là một trong 5 tiên đề của Euclide, là cơ sở của hình học mà chúng ta học từ năm lớp 1 đến nay, hình học Euclide (nếu thích, bạn có thể xem thêm về hình học Euclide ở Bài giảng về xây dựng hình học sơ cấp bằng phương pháp tiên đề). Hoàn toàn dễ thấy, hoàn toàn hiển nhiên, không cần phải chứng minh làm gì cái điều đơn giản đó, có một và chỉ một đường thẳng qua 2 điểm. Có thật như vậy không :-w . <strong>Tiên đề là không thể chứng minh</strong>, bởi vậy, không phải là tuyệt đối đúng, chúng ta chỉ mặc nhiên coi nó đúng thôi. Trong khoảng 1800 năm, người ta chắc chắn về việc có một và chỉ một đường thẳng qua 2 điểm cho tới khi Bernhard Riemann bảo rằng có nhiều hơn một đường như vậy và từ đó xây dựng nên một hình học mới hoàn toàn đúng theo các tiên đề của ông. Và bởi vì không thể chứng minh được điều đó nên khi Lobachevsky lại nói rằng qua 2 điểm chẳng có đường thẳng nào cả thì ông cũng không hề sai :-b , và thế là một hình học mới nữa ra đời. Cả hai hệ thống hình học mới đều hoàn toàn đúng và đã đưa lại những ứng dụng thực tiễn vô cùng quan trọng, có đóng góp không nhỏ vào kho tàng tri thức của nhân loại. Như vậy là trong suốt 1800 năm, chúng ta đã tự giới hạn sự hiểu biết của mình chỉ vì nghĩ rằng một điều gì đó là chân lý, là không thể thay đổi mặc dù không thể chứng minh điều đó. Việc này cũng tương tự như khả năng của chúng ta là vô hạn, chỉ có chúng ta tự giới hạn mình thôi.
Hôm nay, lúc đọc bài viết về Multiple Inheritance in Java, mình lại càng nhận thức rõ những điều trên. Bất kì ai đã học Java đều có thể khẳng định rằng đa thừa kế là không thể trong Java, chắc chắn là như vậy. Thêm một điều nữa, đối với mình, từ trước giớ thừa kế có nghĩa là phải đi từ trừu tượng đến cụ thể, class cha phải là tổng quát hơn class con, class con phải chuyên biệt, cụ thể và mở rộng các chức năng của class cha (và mình thấy bất kì cuốn sách dạy lập trình hướng đối tượng nào cũng làm vậy trong các ví dụ về thừa kế). Nhưng giờ đây, những suy nghĩ, những điều hiển nhiên trên đều bị dẹp bỏ sau khi mình đọc bài viết trên :(( .Không biết là sau việc này thì liệu có cái gì mới ra đời không nửa :D .
Object Oriented Programing (OOP) với Javascript và Prototype.js framework
0 bình luận Được gửi bởi lebinh lúc 3:18 CHLập trình hướng đối tượng trong javascript với Prototype.js framework
Javascript là một ngôn ngữ hướng đối tượng nhưng không thật hoàn chỉnh, nó không có các từ khóa như class hay private,..., không có overloading, thừa kế,... Javascript (mà đúng ra là ECMAScript) vẫn đang trong quá trình phát triển, phiên bản mới nhất của nó là Javascript 1.7, những điểm yếu đó có thể sẽ được khắc phục ở những phiên bản sau này. Nhưng mà, tại sao bạn lại phải chờ khi mà chỉ cần Prototype.js framework, bạn vẫn có thể dùng OOP với javascript một cách thoải mái như dưới đây.
Bạn có thể tải về Prototype version 1.5.0_rc1 ở đây: download Prototype
Tạo một lớp (class) mới
Đối tượng Class là một đối tượng được định nghĩa mới trong Prototype.js, nó chỉ có một phương thức
create();
và phương thức này được dùng để tạo ra một class mới (mà thật ra là một function nhưng mang ý nghĩa hoàn toàn như một class) là Point. Sau đó, bạn thêm vào các thuộc tính và phương thức cho class bằng cách thêm chúng vào đối tượng prototype của đối tượng Point (chú ý Point thật ra là một function nên cũng là một đối tượng). Đồng thời cũng lưu ý rằng phương thức initialize()
là bắt buộc phải có và nó đóng vai trò là phương thức khởi tạo (constructor) của class mới tạo.Ví dụ trên tạo ra một class mới có tên là Point, nó có constructor nhận 2 giá trị là x, y; có một phương thức là getPos() trả về một chuỗi biểu thị tọa độ của điểm; và có 2 thuộc tính __x__, __y__ chứa tọa độ x, y của điểm cần biểu diễn (hai dấu gạch dưới là cách viết được quy ước để các lập trình viên khác biết 2 biến đó là private).
Cách sử dụng class này là hoàn toàn bình thường
Thừa kế (Inheritance)
extend(des,src)
cũng là một phương thức mới được thêm vào đối tượng Object trong Prototype.js, nó chỉ đơn thuần nhận 2 đối tượng des (destination), src (source) và sao chép tất cả các phương thức + thuộc tính từ src vào des. Trong trường hợp này, phương thức này được sử dụng để tạo ra sự thừa kế giữa class ColorPoint với class Point như trên. Để thuận tiện và tạo sự tương đồng với các ngôn ngữ khác, bạn nên theo đúng như thứ tự trên, tạo class, xác định sự thừa kế và cuối cùng là thêm vào các thuộc tính và phương thức cần thiết khác. Chú ý là lúc này bạn không được dùng ColorPoint.prototype = {...};
như trên mà phải dùng Object.extend(ColorPoint.prototype,{...});
. Tuy nhiên ở đây vẫn còn một số vấn đề mà mình vẫn chưa giải quyết được: phải viết lại toàn bộ constructor, không dùng được super
; aColorPoint instanceof Point
sẽ trả về false. À, còn một điều mà bạn có thể đã nhận ra là, với cách thừa kế như trên, Javascript có hỗ trợ đa thừa kế chứ không như Java (không cho phép đa thừa kế); một class con trong javascript có thể thừa kế nhiều class cha tùy thích.Ví dụ trên tạo ra một class mới là ColorPoint thừa kế class Point, có constructor nhận các giá trị là tọa độ x, y và màu; có thêm một phương thức so với class Point là
getColor()
và thuộc tính private __color__
Sử dụng class ColorPoint:
Phương thức và thuộc tính tĩnh (Static method and property)
Phương thức tĩnh là phương thức được gọi trực tiếp thông qua tên lớp, trong Javascript, việc tạo một phương thức tĩnh là vô cùng đơn giản:Nếu bạn muốn tạo một lớp chỉ chứa toàn các phương thức hay thuộc tính tĩnh tương tự như lớp java.lang.Math trong Java thì lại càng đơn giản hơn, không cần phải dùng phương thức
Class.create();
nữa. Mọi việc chỉ đơn giản là tạo ra một đối tượng và gán đủ thứ lên nó:Nếu bạn không muốn tạo một class mới, hãy thêm các phương thức của bạn vào class Math sẵn có, chỉ cần dùng phương thức
Object.extend();
đã nói ở trên:
StringBuilder class
Bạn đã học Java? Bạn đã biết lý do tại sao cần phải có class StringBuilder (trước đây là StringBuffer)? Cũng như trong Java, đối tượng thuộc lớp String trong Javascript là bất biến, một khi đã được tạo ra thì ta không thể thay đổi giá trị của nó nữa. Câu lệnh
var aStr = "abc"+aVar+"edf";
với aVar = 123
khi thực thi sẽ tạo ra một đối tượng String chứa chuỗi "abc123" trước khi tạo ra một đối tượng khác (chiếm một vùng bộ nhớ khác) chứa chuỗi "abc123edf" rồi mới gán đối tượng sau vào biến aStr. Nếu chương trình của chúng ta có nhiều lệnh kiểu như vậy thì sẽ gây ra sự hao phí tài nguyên không cần thiết, ảnh hưởng hiệu quả chương trình. Biện pháp khắc phục cũng tương tự như trong Java, hãy sử dụng mảng. Mảng là một đối tượng đặc biệt, kích thước của nó thay đổi được, và sẽ được tự động cấp thêm bộ nhớ khi cần thiết. Class StringBuilder trong Java chứa chuỗi nhận được trong 1 mảng các ký tự (char), ta có thể thêm một số, một chuỗi,... vào đối tượng thuộc class StringBuilder bằng cách dùng phương thức append()
; để sử dụng chuỗi ta dùng phương thức toString()
. Class StringBuilder cũng chúng ta cũng tương tự như vậy, chứa dữ liệu trong một mảng và có 2 phương thức chính là append()
và toString()
.November rain - Guns 'n Roses
Bài hát dành tặng cho một người bạn
When I look into your eyes
I can see a love restrained
But darlin' when I hold you
Don't you know I feel the same
'Cause nothin' lasts forever
And we both know hearts can change
And it's hard to hold a candle
In the cold November rain
We've been through this such a long long time
Just tryin' to kill the pain
But lovers always come and lovers always go
An no one's really sure who's lettin' go today
Walking away
If we could take the time
to lay it on the line
I could rest my head
Just knowin' that you were mine
All mine
So if you want to love me
then darlin' don't refrain
Or I'll just end up walkin'
In the cold November rain
Do you need some time...on your own
Do you need some time...all alone
Everybody needs some time...
on their own
Don't you know you need some time...all alone
I know it's hard to keep an open heart
When even friends seem out to harm you
But if you could heal a broken heart
Wouldn't time be out to charm you
Sometimes I need some time...on my
own
Sometimes I need some time...all alone
Everybody needs some time...
on their own
Don't you know you need some time...all alone
And when your fears subside
And shadows still remain
I know that you can love me
When there's no one left to blame
So never mind the darkness
We still can find a way
'Cause nothin' lasts forever
Even cold November rain
Don't ya think that you need somebody
Don't ya think that you need someone
Everybody needs somebody
You're not the only one
You're not the only one
Đừng tuyệt vọng hỡi bạn của tôi, đừng phó mặc cuộc đời mình cho số phận. "'Cause nothin' lasts forever. Even cold November rain". Bởi vì không có gì tồn tại mãi mãi, kể cả cơn mưa tháng 11 lạnh giá. Ngay cả trong thời điểm khó khăn đen tối nhất của cuộc đời đi chăng nữa thì Đạt ơi, đừng bỏ cuộc. Mày không thể gục ngã vì chuyện đó được. Khó khăn thật đấy, rắc rối và thật nan giải nhưng mọi chuyện đều có cách giải quyết của nó, tất cả tùy thuộc ở mày. Ngày mai trời sẽ lại sáng, chỉ cần mày dũng cảm đương đầu với chính nó, hãy đừng lẩn trốn và cố quên đi hiện thực như vậy nữa. Cố lên đi Đạt.
Ngày Quốc khánh, buồn thay lại là một ngày rảnh rỗi, buồn chán sau một loạt những ngày tương đối vất vả, lắm việc để làm. Tối nay mới online lần đầu tiên từ lúc vào lại SG, mục đích chính cũng chỉ là để xem giá mấy cái điện thoại cho anh thôi, loanh quanh một hồi lại vào đây. Mấy ngày vừa rồi đúng là lắm chuyện, Nhung cũng xui thật, vừa mất tiền, vừa hư xe nhà mới chưa ở được, phải chạy lung tung 2 ngày rồi cái TV nó vất vả cầm vào cũng bị hư luôn. Đành an ủi nó là xui luôn một lần rồi sau ni may mắn, nó xui thì em nó sẽ may mắn, bù trừ mà. Mình cũng chẳng hơn gì, cả một đống hóa đơn, điện thoại cố định thì bị cắt, internet cũng bị cắt vì chưa nộp tiền, chuyện nhà cửa của cậu cũng rắc rối. Chán. Chắc phải như bức ảnh này quá.
"Will code HTML for food", có ai cần không vậy?? Khồng biết bao giờ mới có thể kiếm được nhiều thật là nhiều tiền từ cái nghề CNTT mình đang học nhỉ, hehe? Trước giờ hình như mình cũng chỉ 2 lần được trả công cho cái việc này, một của Huy và một của Echip, ít thật.