text:
Trở về Mục lục cuốn sách
11.1 Lời định nghĩa lớp và các kiểu đối tượng
Trở về tận Mục 1.5 khi chúng ta định nghĩa lớp Hello, ta đồng thời tạo nên một kiểu đối tượng có tên Hello. Ta không tạo nên biến nào thuộc kiểu Hello này, và cũng không dùng new để tạo ra đối tượng Hello nào, song việc đó là hoàn toàn có thể!
Ví dụ đó chẳng có mấy tác dụng minh họa, bởi không lý gì để ta tạo ra một đối tượng Hello như vậy, và dù có tạo nên thì cũng chảng để làm gì. Trong chương này, ta sẽ xét đến những định nghĩa lớp để tạo nên các kiểu đối tượng có ích.
Sau đây là những ý tưởng quan trọng nhất trong chương:
- Việc định nghĩa một lớp mới đồng thời cũng tạo nên một đối tượng mới cùng tên.
- Lời định nghĩa lớp cũng giống như một bản mẫu cho các đối tượng: nó quy định những biến thực thể nào mà đối tượng đó chứa đựng, và những phương thức nào có thể hoạt động với chúng.
- Mỗi đối tượng thuộc về một kiểu đối tượng nào đó; như vậy, nó là một thực thể của một lớp nào đó.
- Khi bạn kích hoạt new để tạo nên một đối tượng, Java kích hoạt một phương thức đặc biệt có tên là constructor để khởi tạo các biến thực thể. Bạn cần cung cấp một hoặc nhiều constructor trong lời định nghĩa lớp.
- Các phương thức thao tác trên một kiểu được định nghĩa trong lời định nghĩa lớp cho kiểu đó.
Sau đây là một số vấn đề về lời định nghĩa lớp:
- Tên lớp (và do đó, tên của kiểu đối tượng) nên bắt đầu bàng một chữ in, để phân biệt chúng với các kiểu nguyên thủy và những tên biến.
- Bạn thường đặt một lời định nghĩa lớp vào trong mỗi file, và tên của file phải giống như tên của lớp, với phần mở rộng .java. Chẳng hạn, lớp Time được định nghĩa trong file có tên Time.java.
- Ở bất kì chương trình nào, luôn có một lớp được giao làm lớp khởi động. Lớp khởi động phải chứa một phương thức mang tên main, đó là nơi mà việc thực thi chương trình bắt đầu. Các lớp khác cũng có thể chứa phương thức cùng tên main, song phương thức đó sẽ không được thực thi từ đầu.
Khi đã nêu những vấn đề này rồi, ta hãy xét một ví dụ về lớp do người dùng định nghĩa, lớp Time.
11.2 Time
Một động lực chung cho việc tạo nên kiểu đối tượng, đó là để gói gọn những dữ liệu liên quan vào trong một đối tượng để ta có thể coi như một đơn vị duy nhất. Ta đã gặp hai kiểu như vậy, đó là Point và Rectangle.
Một ví dụ khác, mà ta sẽ tự tay lập nên, là Time, để biểu diễn giờ đồng hồ. Dữ liệu được gói trong một đối tượng Time bao gồm có số giờ, số phút, và số giây. Bởi mỗi đối tượng Time đều chứa những dữ liệu này, nên ta cần biến thực thể để lưu giữ chúng.
Bước đầu tiên là xác định xem từng biến phải thuộc kiểu gì. Dường như rõ ràng là hour (giờ) và minute (phút) đều phải là những số nguyên. Để cho vấn đề được thú vị hơn, ta hãy đặt second (giây) là một double.
Các biến thực thể được định nghĩa ở đoạn đầu của lời khai báo lớp, bên ngoài bất kì lời khai báo phương thức nào khác, như sau:
class Time { int hour, minute; double second; }
Đoạn mã này tự bản thân nó đã là lời khai báo lớp hợp lệ. Sơ đồ trạng thái cho một đối tượng Time sẽ trông như sau:
Sau khi khai báo các biến thực thể, bước tiếp theo là định nghĩa một constructor cho lớp mới này.
11.3 Constructor
Các constructor có nhiệmvụ khởi tạo các biến thực thể. Cú pháp của constructor cũng giống như của các phương thức khác, trừ ba điểm sau:
- Tên của constructor phải giống như tên lớp.
- Constructor không có kiểu trả về và cũng không có giá trị trả về.
- Từ khoá static được bỏ qua.
Sau đây là một ví dụ cho lớp Time:
public Time() { this.hour = 0; this.minute = 0; this.second = 0.0; }
Ở chỗ mà bạn trông đợi một kiểu trả về, giữa public and Time, lại không có gì cả. Điều đó cho thấy cách mà chúng ta (và trình biên dịch nữa) có thể phân biệt được rằng đây là một constructor.
Constructor này không nhận tham số nào. Mỗi dòng của constructor khởi tạo một biến thực thể cho một giá trị mặc định (trong trường hợp này là nửa đêm). Cái tên this là một từ khóa đặc biệt để tham chiếu tới đối tượng mà ta đang tạo nên. Bạn có thể dùng this theo cách giống như dùng tên của bất kì đối tượng nào khác. Chẳng hạn, bạn có thể đọc và ghi các biến thực thể của this, và cũng truyền được this với vai trò tham số đến những phương thức khác.
Nhưng bạn không khai báo cái this này và cũng không thể gán giá trị cho nó. this được tạo bởi hệ thống; tất cả những gì bạn phải làm đó là khởi tạo các biến thực thể của nó.
Một lỗi thường gặp khi viết ra constructor là việc đưa câu lệnh return vào cuối. Hãy kiềm chế, tránh làm việc này.
11.4 Thêm các constructor
Constructor có thể được chồng chất [xem thêm phần “Quá tải”], cũng như các phương thức khác, theo nghĩa bạn có thể có nhiều constructor với các tham số khác nhau. Java biết rõ cần phải kích hoạt constructor nào bằng cách khớp những tham số của new với các tham số của constructor.
Việc có constructor không nhận đối số (như trên) là hoàn toàn bình thường, cũng như constructor nhận một danh sách tham số giống hệt với danh sách các biến thực thể. Chẳng hạn:
public Time(int hour, int minute, double second) { this.hour = hour; this.minute = minute; this.second = second; }
Các tên và kiểu của những tham số cũng giống với tên và kiểu của các biến thực thể. Tất cả những gì mà constructor này làm chỉ là sao chép thông tin từ các tham số sang các biến thực thể.
Nếu xem tài liệu về Point và Rectangle, bạn sẽ thấy rằng cả hai lớp này đều có những constructor kiểu như trên. Việc chồng chất constructor cho phép linh hoạt tạo nên đối tượng trước rồi sau đó mới điền vào phần trống, hoặc để thu thập toàn bộ thông tin trước khi lập ra đối tượng.
Điều này nghe thì có vẻ không đáng quan tâm, song thực ra thì khác. Việc viết những constructor là quá trình máy móc, buồn tẻ. Một khi bạn đã viết được hai constructor rồi, bạn sẽ thấy rằng mình có thể viết chúng nhanh chóng chỉ qua việc trông vào danh sách các biến thực thể.
11.5 Tạo nên đối tượng mới
Mặc dù trông giống như phương thức, song constructor không bao giờ được kích hoạt trực tiếp. Thay vì vậy, khi bạn kích hoạt new, hệ thống sẽ huy động dung lượng bộ nhớ cho đối tượng mới và kích hoạt constructor này.
Chương trình sau giới thiệu hai cách làm để lập thành và khởi tạo các đối tượng Time:
class Time { int hour, minute; double second; public Time() { this.hour = 0; this.minute = 0; this.second = 0.0; } public Time(int hour, int minute, double second) { this.hour = hour; this.minute = minute; this.second = second; } public static void main(String[] args) { // một cách lập thành và khởi tạo đối tượng Time Time t1 = new Time(); t1.hour = 11; t1.minute = 8; t1.second = 3.14159; System.out.println(t1); // một cách khác để thực hiện việc tương tự Time t2 = new Time(11, 8, 3.14159); System.out.println(t2); } }
Trong main, lần đầu tiên kích hoạt new, ta không cấp cho đối số nào, bởi vậy Java kích hoạt constructor thứ nhất. Vài dòng phía dưới thực hiện gán giá trị cho các biến thực thể.
Lần thứ hai kích hoạt new, ta cấp các đối số khớp với các tham số của constructor thứ hai. Cách khởi tạo biến thực thể này gọn gàng hơn và hiệu quả hơn một chút, song cách làm này có thể khó đọc, bởi nó không rõ ràng là giá trị nào được gán cho biến thực thể nào.
11.6 In các đối tượng
Kết quả của chương trình nêu trên là:
Time@80cc7c0 Time@80cc807
Khi Java in giá trị của kiểu đối tượng do người dùng định nghĩa, nó sẽ in tên kiểu cùng một mã thập lục phân đặc biệt riêng của từng đối tượng. Mã này bản thân nó chẳng có ý nghĩa gì; thực tế nó khác nhau tuỳ máy tính và thậm chí tuỳ cả những lần chạy chương trình. Nhưng có thể nó giúp ích cho việc gỡ lỗi, trong trường hợp bạn muốn theo dõi từng đối tượng riêng rẽ.
Để in các đối tượng theo cách có ý nghĩa hơn đối với người dùng (chứ không phải đối với lập trình viên), bạn có thể viết một phương thức với tên gọi kiểu như printTime:
public static void printTime(Time t) { System.out.println(t.hour + ":" + t.minute + ":" + t.second); }
Hãy so sánh phương thức này với phiên bản printTime ở Mục 3.10.
Kết quả của phương thức này, nếu ta truyền t1 hoặc t2 làm đối số, sẽ là 11:8:3.14159. Mặc dù ta có thể nhận ra đây là giờ đồng hồ, nhưng cách viết này không hề theo chuẩn quy định. Chẳng hạn, nếu số phút hoặc số giây nhỏ hơn 10, ta sẽ luôn dự kiển rằng có số 0 đi trước. Ngoài ra, có thể ta còn muốn bỏ phần thập phân của số giây đi. Nói cách khác, ta muốn kết quả kiểu như 11:08:03.
Trong đa số những ngôn ngữ lập trình, có nhiều cách đơn giản để điều khiển định dạng đầu ra cho kết quả số. Trong Java thì không có cách đơn giản nào.
Java có những công cụ mạnh dành cho việc in dữ liệu được định dạng như giờ đồng hồ và ngày tháng, đồng thời cũng có công cụ để diễn giải dữ liệu vào được định dạng. Song thật không may là những công cụ như vậy không dễ sử dụng, nên tôi sẽ bỏ qua chúng trong khuôn khổ cuốn sách này. Nếu muốn, bạn có thể xem qua tài liệu của lớp Date trong gói java.util.
11.7 Các thao tác với đối tượng
Trong một vài mục tiếp theo, tôi sẽ giới thiệu ba dạng phương thức hoạt động trên các đối tượng:
- hàm thuần tuý:
- Nhận các đối tượng làm tham số nhưng không thay đổi chúng. Giá trị trả lại thuộc kiểu nguyên thuỷ hoặc một đối tượng mới tạo ra bên trong phương thức này.
- phương thức sửa đổi:
- Nhận đối số là các đối tượng rồi sửa đổi một vài, hoặc tất cả những đối tượng đó. Thường trả lại đối tượng rỗng (void).
- phương thức điền:
- Một trong các đối số là đối tượng “trống trơn” sẽ được phương thức điền thông tin vào. Về mặt kĩ thuật, đây cũng chính là một dang phương thức sửa đổi.
Với một phương thức cho trước ta thường có thể viết nó dưới dạng hàm thuần túy, phương thức sửa đổi hay phương thức điền. Tôi sẽ bàn thêm về ưu nhược điểm của từng hình thức một.
11.8 Các hàm thuần túy
Một phương thức được coi là hàm thuần túy nếu như kết quả chỉ phụ thuộc vào các đối số, và phương thức này không có hiệu ứng phụ như thay đổi một đối số hoặc in ra thông tin gì. kết quả duy nhất của việc kích hoạt một hàm thuần túy, đó là giá trị trả lại.
Một ví dụ là isAfter, để so sánh hai đối tượng Time rồi trả lại một boolean để chỉ định xem liệu toán hạng thứ nhất có xếp trước toán hạng thứ hai hay không:
public static boolean isAfter(Time time1, Time time2) { if (time1.hour > time2.hour) return true; if (time1.hour < time2.hour) return false; if (time1.minute > time2.minute) return true; if (time1.minute < time2.minute) return false; if (time1.second > time2.second) return true; return false; }
Kết quả của phương thức này sẽ là gì nếu hai thời gian đã cho bằng nhau? Liệu đó có phải là kết quả phù hợp đối với phương thức này không? Nếu bạn viết tài liệu cho phương thức này, liệu bạn có đề cập rõ đến trường hợp đó không?
Ví dụ thứ hai là addTime, phương thức tính tổng hai thời gian. Chẳng hạn, nếu bây giờ là 9:14:30, và người làm bánh cần 3 giờ 35 phút, thì bạn có thể dùng addTime để hình dung ra khi nào bánh ra lò.
Sau đây là bản sơ thảo của phương thức này; nó chưa thật đúng:
public static Time addTime(Time t1, Time t2) { Time sum = new Time(); sum.hour = t1.hour + t2.hour; sum.minute = t1.minute + t2.minute; sum.second = t1.second + t2.second; return sum; }
Mặc dù phương thức này trả lại một đối tượng Time, song nó không phải là constructor. Bạn cần xem lại và so sánh cú pháp của một phương thức dạng này với cú pháp của một constructor, vì chúng dễ gây nhầm lẫn.
Sau đây là một ví dụ về cách dùng phương thức. Nếu như currentTime chứa thời gian hiện tại và breadTime chứa thời gian cần để người thợ nướng bánh, thì bạn có thể dùng addTime để hình dung ra khi nào sẽ nướng xong bánh.
Time currentTime = new Time(9, 14, 30.0); Time breadTime = new Time(3, 35, 0.0); Time doneTime = addTime(currentTime, breadTime); printTime(doneTime);
Kết quả của chương trình, 12:49:30.0, là đúng. Mặt khác, cũng có những trường hợp mà kết quả không đúng. Bạn có đoán được một trường hợp như vậy không?
Vấn đề là ở chỗ phương thức này không xử lý được tình huống khi số giây hoặc số phút cộng lại vượt quá 60. Trong trường hợp đó, ta phải “nhớ” số giây còn dư vào cột số phút, hoặc nhớ số phút dư vào cột giờ.
Sau đây là một dạng đúng của phương thức này.
public static Time addTime(Time t1, Time t2) { Time sum = new Time(); sum.hour = t1.hour + t2.hour; sum.minute = t1.minute + t2.minute; sum.second = t1.second + t2.second; if (sum.second >= 60.0) { sum.second -= 60.0; sum.minute += 1; } if (sum.minute >= 60) { sum.minute -= 60; sum.hour += 1; } return sum; }
Mặc dù cách này đúng, song chương trình bắt đầu dài dòng. Sau này tôi sẽ gợi ý một giải pháp khác ngắn hơn nhiều.
Đoạn mã lệnh trên giới thiệu hai toán tử mà ta chưa từng gặp, += và -=. Những toán tử này cho ta viết ngắn gọn lệnh tăng hoặc giảm biến. Chúng cũng gần giống như ++ và --, chỉ khác ở chỗ (1) chúng làm việc được cả với double lẫn int, và (2) lượng tăng hoặc giảm không nhất thiết bằng 1. Câu lệnh sum.second -= 60.0; tương đương với sum.second = sum.second - 60;
11.9 Phương thức sửa đổi
Xét một ví dụ về phương thức sửa đổi, phương thức increment, nhằm tăng thêm một số giây cho trước vào một đối tượng Time. Một lần nữa, ta có bản nháp phương thức này như sau:
public static void increment(Time time, double secs) { time.second += secs; if (time.second >= 60.0) { time.second -= 60.0; time.minute += 1; } if (time.minute >= 60) { time.minute -= 60; time.hour += 1; } }
Dòng đầu tiên thực hiện thao tác cơ bản; những dòng còn lại để xử lý các trường hợp ta đã xét.
Liệu phương thức này có đúng không? Điều gì sẽ xảy ra nếu đối số secs lớn hơn nhiều so với 60? Trong trường hợp như vậy, trừ đi 60 một lần là chưa đủ; ta phải tiếp tục trừ đến khi second nhỏ hơn 60. Ta có thể làm điều này bằng cách thay các lệnh if bằng các lệnh while:
public static void increment(Time time, double secs) { time.second += secs; while (time.second >= 60.0) { time.second -= 60.0; time.minute += 1; } while (time.minute >= 60) { time.minute -= 60; time.hour += 1; } }
Giải pháp này đúng đắn, nhưng chưa hiệu quả lắm. Bạn có thể nghĩ ra lời giải nào không cần đến tính lặp hay không?
11.10 Các phương thức điền
Thay vì việc tạo nên đối tượng mới mỗi khi addTime được kích hoạt, ta có thể yêu cầu chương trình gọi hãy cung cấp một đối tượng nơi mà addTime lưu kết quả. Hãy so sánh đoạn mã sau với phiên bản trước:
public static void addTimeFill(Time t1, Time t2, Time sum) { sum.hour = t1.hour + t2.hour; sum.minute = t1.minute + t2.minute; sum.second = t1.second + t2.second; if (sum.second >= 60.0) { sum.second -= 60.0; sum.minute += 1; } if (sum.minute >= 60) { sum.minute -= 60; sum.hour += 1; } }
Kết quả được lưu trong sum, nên kiểu trả về là void.
Các phương thức sửa đổi và phương thức điền đều hiệu quả vì chúng không phải tạo nên đối tượng mới. Nhưng chúng lại gây khó khăn trong việc cô lập các phần khác nhau của chương trình; trong những dự án lớn chúng có thể gây nên lỗi rất khó tìm ra.
Các hàm thuần túy giúp ta quản lý tính chất phức tạp của những dự án lớn, phần là nhờ ngăn không cho những loại lỗi nhất định không thể xảy ra. Hơn nữa, hàm thuần túy còn thích hợp với những kiểu lập trình ghép và lồng. Và vì kết quả của hàm thuần túy chỉ phụ thuộc vào tham số, ta có thể tăng tốc cho nó bằng cách lưu giữ những giá trị đã tính toán từ trước.
Tôi gợi ý rằng bạn nên viết hàm thuần túy mỗi lúc thấy được, và chỉ dùng đến phương thức sửa đổi khi thấy rõ ưu điểm vượt trội.
11.11 Lập kế hoạch và phát triển tăng dần
Trong chương trình này tôi giới thiệu một quá trình phát triển chương trình với tên gọi lập nguyên mẫu nhanh1. Với từng phương thức, tôi viết một bản sơ thảo để thực hiện tính toán cơ bản, rồi kiểm tra nó với một vài trường hợp, sửa những lỗi bắt gặp được.
Cách tiếp cận này có thể hiệu quả, song nó có thể dẫn đến mã lệnh phức tạp một cách không cần thiết—vì nó xử lý quá nhiều trường hợp đặc biệt—và cũng kém tin cậy—vì thật khó tự thuyết phục rằng bạn đã tìm thấy tất cả những lỗi trong chương trình.
Một cách khác là xem xét kĩ hơn vấn đề nhằm tìm mấu chốt có thể giúp việc lập trình dễ dàng hơn. Trong trường hợp này điểm mấu chốt bên trong là: Time thực ra là một số có ba chữ số trong hệ cơ số 60! Số giây, second, là hàng đơn vị, số phút, minute, là hàng 60, còn số giờ, hour, là hàng 3600.
Khi ta viết addTime và increment, thực chất là ta đang tính cộng ở hệ 60; đó là lý do tại sao ta phải “nhớ” từ hàng này sang hàng khác.
Một cách tiếp cận khác đối với tổng thể bài toán là chuyển Time thành double rồi lợi dụng khả năng tính toán của máy đối với double. Sau đây là một phương thức chuyển đổi Time thành double:
public static double convertToSeconds(Time t) { int minutes = t.hour * 60 + t.minute; double seconds = minutes * 60 + t.second; return seconds; }
Bây giờ tất cả những gì ta cần là cách chuyển từ double sang đối tượng Time. Ta có thể viết một phương thức để thực hiện điều này, song có lẽ hợp lý hơn la viết một constructor thứ ba:
public Time(double secs) { this.hour =(int)(secs / 3600.0); secs -= this.hour * 3600.0; this.minute =(int)(secs / 60.0); secs -= this.minute * 60; this.second = secs; }
Constructor này hơi khác những constructor khác; nó bao gồm những tính toán bên cạnh phép gán cho các biến thực thể.
Có thể bạn phải suy nghĩ để tự thuyết phục bản thân rằng kĩ thuật mà tôi dùng để chuyển từ hệ cơ số này sang cơ số kia là đúng. Nhưng một khi bạn đã bị thuyết phục rồi, ta có thể dùng những phương thức này để viết lại addTime:
public static Time addTime(Time t1, Time t2) { double seconds = convertToSeconds(t1) + convertToSeconds(t2); return new Time(seconds); }
Mã lệnh trên ngắn hơn phiên bản gốc, và dễ thấy hơn hẳn rằng mã lệnh này đúng đắn (với giả thiết thường lệ rằng những phương thức nó kích hoạt cũng đều đúng). Việc viết lại increment theo cách tương tự được dành cho bạn như một bài tập.
11.12 Khái quát hóa
Trong chừng mực nào đó, việc chuyển đổi qua lại giữa các hệ cơ số 60 và 10 khó hơn việc xử lý thời gian đơn thuần. Việc chuyển hệ cơ số thì trừu tượng hơn, còn trực giác của ta xử lý thời gian tốt hơn.
Nhưng nếu ta có hiểu biết sâu để coi thời gian như các số trong hệ 60, và đầu tư công sức viết những phương thức chuyển đổi (convertToSeconds và constructor thứ ba), ta sẽ thu được một chương trình ngắn hơn, dễ đọc và gỡ lỗi, đồng thời đáng tin cậy hơn.
Việc bổ sung các đặc tính sau này cũng dễ dàng hơn. Hãy tưởng tượng ta cần trừ hai đối tượng Time để tìm ra khoảng thời gian giữa chúng. Cách làmthực hiện tính trừ có nhớ. Nhưng dùng phương thức để chuyển đổi sẽ dễ hơn nhiều.
Điều trớ trêu là, đôi khi việc làm cho bài toán khó hơn (tổng quát hơn) lại khiến cho dễ dàng hơn (ít trường hợp đặc biệt, ít khả năng gây ra lỗi).
11.13 Thuật toán
Khi bạn viết một lời giải tổng quát cho một lớp các bài toán, thay vì tìm lời giải riêng cho một bài toán riêng lẻ, bạn đã viết một thuật toán. Thật không dễ định nghĩa thuật ngữ này, bởi vậy tôi sẽ cố gắng thử vài cái tiếp cận khác nhau.
Trước hết, hãy xét một số thứ không phải là thuật toán. Khi bạn học tính nhân giữa hai số, có lẽ bạn đã ghi nhớ bản cửu chương. Thật ra, bạn đã học thuộc lòng 100 lời giải cụ thể, bởi vậy kiến thức này thực sự không phải là thuật toán.
Nhưng nếu bạn “lười biếng,” có thể bạn đã học hỏi được mấy mẹo vặt. Chẳng hạn, để tính tính của một số n với 9, bạn có thể viết n−1 là chữ số thứ nhất và 10−n là chữ số thứ hai. Mẹo này là lời giải tổng quát để nhân một số dưới mười bất kì với 9. Đó chính là thuật toán!
Tương tự, những kĩ thuật bạn học để cộng có nhớ, trừ có nhớ, và phép chia số lớn đều là những thuật toán. Một trong những đặc điểm của thuật toán là chúng không cần trí thông minh để thực hiện. Chúng chỉ là những cơ chế máy móc trong đó từng bước nối tiếp nhau theo một loạt những nguyên tắc đơn giản.
Theo ý kiến của tôi, thật đáng ngại khi thấy rằng chúng ta dành quá nhiều thời gian trên lớp để học cách thực hiện những thuật toán mà, nói thẳng ra là, không cần trí thông minh gì cả. Mặt khác, quá trình thiết kế những thuật toán lại thú vị, đầy thử thách trí tuệ, và là phần trung tâm của việc mà ta gọi là lập trình.
Có những việc mà con người làm theo lẽ tự nhiên, chẳng khó khăn hay phải suy nghĩ gì, lại là những thứ khó biểu diễn bằng thuật toán nhất. Việc hiểu ngôn ngữ là một ví dụ điển hình. Chúng ta ai cũng làm vậy, nhưng đến nay chưa ai giải thích được rằng ta làm vậy bằng cách nào, ít nhất là biểu diễn dưới dạng thuật toán.
Bạn sẽ sớm có cơ hội thiết kế những thuật toán đơn giản cho nhiều bài toán khác nhau.
11.14 Thuật ngữ
- lớp:
- Trước đây, tôi đã định nghĩa lớp là một tập hợp các phương thức có liên quan. Trong chương này ta còn được biết rằng lời định nghĩa lớp cũng đồng thời là một bản mẫu của một kiểu đối tượng mới.
- thực thể:
- Thành viên của một lớp. Mỗi đối tượng đều là thực thể của một lớp nào đó.
- constructor:
- Một phương thức đặc biệt để khởi tạo các biến thực thể của một đối tượng mới lập nên.
- lớp khởi động:
- Lớp có chứa phương thức main nơi bắt đầu việc thực thi chương trình.
- hàm thuần túy:
- Phương thức mà kết quả chỉ phụ thuộc vào các tham số của nó, và không gây hiệu ứng phụ nào ngoài việc trả lại một giá trị.
- phương thức sửa đổi:
- Phương thức làm thay đổi một hay nhiều đối tượng nhận làm tham số, và thường trả lại void.
- phương thức điền:
- Kiểu phương thức nhận tham số là một đối tượng “trống không” và điền vào những biến thực thể của nó thay vì việc phát sinh một giá trị trả lại.
- thuật toán:
- Một loạt những chỉ dẫn nhằm giải một lớp các bài toán theo một quá trình máy móc.
11.15 Bài tập
Bài tập 1 Trong trò chơi trên bàn có tên Scrabble2, mỗi miếng vuông để xếp lên bàn sẽ chứa một chữ cái, để xêm nên các từ có nghĩa, và đồng thời có một điểm số; từ đó ta tính được điểm cho các từ khác nhau.
- Hãy viết một định nghĩa lớp có tên Tile để biểu diễn các miếng vuông Scrabble. Các biến thực thể sẽ gồm một kí tự có tên letter và một số nguyên có tên value.
- Hãy viết một constructor để nhận các tham số letter và value rồi khởi tạo các biến thực thể.
- Viết một phương thức có tên printTile để nhận tham số là một đối tượng Tile rồi in ra các biến thực thể dưới định dạng mà người thường có thể đọc được.
- Viết một phương thức có tên testTile để tạo nên một đối tượng Tile có chữ cái Z và giá trị 10, rồi dùng printTile để in ra trạng thái của đối tượng này.
Mục đích của bài tập này là để luyện tập phần cơ chế tạo nên một lời định nghĩa lớp và mã lệnh để kiểm tra nó.
Bài tập 3 Phân số là số có thể biểu điễn được dưới dạng tỉ số giữa hai số nguyên. Chẳng hạn, 2/3 là một phân số, và bạn cũng có thể coi 7 là một phân số với mẫu số ngầm định bằng 1. Ở bài tập này, bạn sẽ viết một lời định nghĩa lớp cho các phân số.
- Lập một chương trình mới có tên Rational.java để định nghĩa một lớp tên là Rational. Một đối tượng Rational phải có hai biến thực thể số nguyên để lưu trữ tử số và mẫu số.
- Viết một constructor không nhận tham số nào để đặt tử số bằng 0 và mẫu số bằng 1.
- Viết một phương thức có tên printRational để nhận vào đối số là một đối tượng Rational rồi in nó ra theo định dạng hợp lý.
- Viết một phương thức main để lập nên một đối tượng mới có kiểu là Rational, đặt các biến thực thể của nó bằng giá trị cụ thể, rồi in đối tượng này ra.
- Đến đây, bạn đã có một chương trình tối thiểu có thể chạy thử được. Hãy chạy để kiểm tra nó, và gỡ lỗi, nếu cần.
- Viết một constructor thứ hai cho lớp này có nhận vào hai đối số rồi sử dụng chúng để khởi tạo các biến thực thể.
- Hãy viết một phương thức có tên negate để đảo dấu của phân số. Phương thức này phải là một phân thức sửa đổi, và vì vậy cần phải trả lại void. Hãy viết thêm dòng lệnh trong main để kiểm tra phương thức mới này.
- Viết một phương thức có tên invert để nghịch đảo số bằng cách tráo đổi tử số và mẫu số. Hãy viết thêm dòng lệnh trong main để kiểm tra phương thức mới này.
- Viết một phương thức có tên toDouble để chuyển đổi phân số thành một số double (số dấu phẩy động) rồi trả lại kết quả. Phương thức này là một hàm thuần tuý; nó không thay đổi đối tượng. Như thường lệ, hãy kiểm tra phương thức mới viết.
- Viết một phương thức có tên reduce để rút gọn một phân số về dạng tối giản bằng cách tìm ước số chung lớn nhất của tử số và mẫu số rồi cùng chia cả tử lẫn mẫu cho ước chung này. Phương thức nêu trên phải là một hàm thuần tuý; nó không được phép thay đổi các biến thực thể của đối tượng mà nó được kích hoạt lên. Để tính ước số chung lớn nhất, hãy xem Bài tập 10 của Chương 6).
- Viết một phương thức có tên add để nhận hai đối số là hai Rational rồi trả lại một đối tượng Rational mới. Đối tượng được trả lại phải chứa tổng của các đối số. có vài cách thực hiện phép cộng này. Bạn có thể dùng bất kì cách nào, nhưng hãy đảm bảo rằng kết quả của phép tính phải được rút gọn sao cho tử và mẫu không có ước số chung nào khác (ngoài 1).
Mục đích của bài tập này là nhằm viết một lời định nghĩa hàm có chứa nhiều loại phương thức, bao gồm constructors, phương thức sửa đổi, và hàm thuần tuý.
- 1
- Cái mà tôi gọi là “nguyên mẫu nhanh” (rapid prototyping) ở đây rất giống với cách phát triển dựa trên kiểm thử (test-driven development, TDD); sự khác biệt là ở chỗ TDD thường dựa trên kiểm thử tự động. Xem http://en.wikipedia.org/wiki/Test-driven_development.
- 2
- Scrabble là một nhãn hiệu đã đăng kí ở Hoa Kì và Canada, thuộc về cty Hasbro Inc., và ở các nước còn lại trên thế giới, thì thuộc về J.W. Spear & Sons Limited ở Maidenhead, Berkshire, Anh Quốc, công ty nhánh của Mattel Inc.
3 responses to “Chương 11: Tự tạo nên những đối tượng riêng”
Pingback: Think Java: Cách suy nghĩ như nhà khoa học máy tính | Blog của Chiến
“Để tính ước số chung lớn nhất, hãy xem Bài tập 10 của Chương 8)”.nghiêm túc đấy chứ ?
Đúng ra là Bài tập 10 của Chương 6. Cám ơn bạn đã phát hiện ra lỗi sai.

markdown:
Trở về
[Mục lục](https://quangchien.wordpress.com/2013/06/29/think-java/#toc) cuốn sách
11.1 Lời định nghĩa lớp và các kiểu đối tượng
Trở về tận Mục 1.5 khi chúng ta định nghĩa lớp
`Hello`, ta đồng thời tạo nên một kiểu đối tượng có tên `Hello`. Ta không tạo nên biến nào thuộc kiểu `Hello` này, và cũng không dùng `new` để tạo ra đối tượng `Hello` nào, song việc đó là hoàn toàn có thể!
Ví dụ đó chẳng có mấy tác dụng minh họa, bởi không lý gì để ta tạo ra một đối tượng
`Hello` như vậy, và dù có tạo nên thì cũng chảng để làm gì. Trong chương này, ta sẽ xét đến những định nghĩa lớp để tạo nên các kiểu đối tượng *có ích*.
Sau đây là những ý tưởng quan trọng nhất trong chương:
- Việc định nghĩa một lớp mới đồng thời cũng tạo nên một đối tượng mới cùng tên.
- Lời định nghĩa lớp cũng giống như một bản mẫu cho các đối tượng: nó quy định những biến thực thể nào mà đối tượng đó chứa đựng, và những phương thức nào có thể hoạt động với chúng.
- Mỗi đối tượng thuộc về một kiểu đối tượng nào đó; như vậy, nó là một thực thể của một lớp nào đó.
- Khi bạn kích hoạt
`new`để tạo nên một đối tượng, Java kích hoạt một phương thức đặc biệt có tên là **constructor**để khởi tạo các biến thực thể. Bạn cần cung cấp một hoặc nhiều constructor trong lời định nghĩa lớp.
- Các phương thức thao tác trên một kiểu được định nghĩa trong lời định nghĩa lớp cho kiểu đó.
Sau đây là một số vấn đề về lời định nghĩa lớp:
- Tên lớp (và do đó, tên của kiểu đối tượng) nên bắt đầu bàng một chữ in, để phân biệt chúng với các kiểu nguyên thủy và những tên biến.
- Bạn thường đặt một lời định nghĩa lớp vào trong mỗi file, và tên của file phải giống như tên của lớp, với phần mở rộng
`.java`. Chẳng hạn, lớp `Time`được định nghĩa trong file có tên `Time.java`.
- Ở bất kì chương trình nào, luôn có một lớp được giao làm
**lớp khởi động**. Lớp khởi động phải chứa một phương thức mang tên `main`, đó là nơi mà việc thực thi chương trình bắt đầu. Các lớp khác cũng *có thể*chứa phương thức cùng tên `main`, song phương thức đó sẽ không được thực thi từ đầu.
Khi đã nêu những vấn đề này rồi, ta hãy xét một ví dụ về lớp do người dùng định nghĩa, lớp
`Time`.
11.2 Time
Một động lực chung cho việc tạo nên kiểu đối tượng, đó là để gói gọn những dữ liệu liên quan vào trong một đối tượng để ta có thể coi như một đơn vị duy nhất. Ta đã gặp hai kiểu như vậy, đó là
`Point` và `Rectangle`.
Một ví dụ khác, mà ta sẽ tự tay lập nên, là
`Time`, để biểu diễn giờ đồng hồ. Dữ liệu được gói trong một đối tượng Time bao gồm có số giờ, số phút, và số giây. Bởi mỗi đối tượng `Time` đều chứa những dữ liệu này, nên ta cần biến thực thể để lưu giữ chúng.
Bước đầu tiên là xác định xem từng biến phải thuộc kiểu gì. Dường như rõ ràng là
`hour` (giờ) và `minute` (phút) đều phải là những số nguyên. Để cho vấn đề được thú vị hơn, ta hãy đặt `second` (giây) là một `double`.
Các biến thực thể được định nghĩa ở đoạn đầu của lời khai báo lớp, bên ngoài bất kì lời khai báo phương thức nào khác, như sau:
class Time { int hour, minute; double second; }
Đoạn mã này tự bản thân nó đã là lời khai báo lớp hợp lệ. Sơ đồ trạng thái cho một đối tượng
`Time` sẽ trông như sau:
Sau khi khai báo các biến thực thể, bước tiếp theo là định nghĩa một constructor cho lớp mới này.
11.3 Constructor
Các constructor có nhiệmvụ khởi tạo các biến thực thể. Cú pháp của constructor cũng giống như của các phương thức khác, trừ ba điểm sau:
- Tên của constructor phải giống như tên lớp.
- Constructor không có kiểu trả về và cũng không có giá trị trả về.
- Từ khoá
`static`được bỏ qua.
Sau đây là một ví dụ cho lớp
`Time`:
public Time() { this.hour = 0; this.minute = 0; this.second = 0.0; }
Ở chỗ mà bạn trông đợi một kiểu trả về, giữa
`public` and `Time`, lại không có gì cả. Điều đó cho thấy cách mà chúng ta (và trình biên dịch nữa) có thể phân biệt được rằng đây là một constructor.
Constructor này không nhận tham số nào. Mỗi dòng của constructor khởi tạo một biến thực thể cho một giá trị mặc định (trong trường hợp này là nửa đêm). Cái tên
`this` là một từ khóa đặc biệt để tham chiếu tới đối tượng mà ta đang tạo nên. Bạn có thể dùng `this` theo cách giống như dùng tên của bất kì đối tượng nào khác. Chẳng hạn, bạn có thể đọc và ghi các biến thực thể của `this`, và cũng truyền được `this` với vai trò tham số đến những phương thức khác.
Nhưng bạn không khai báo cái
`this` này và cũng không thể gán giá trị cho nó. `this` được tạo bởi hệ thống; tất cả những gì bạn phải làm đó là khởi tạo các biến thực thể của nó.
Một lỗi thường gặp khi viết ra constructor là việc đưa câu lệnh
`return` vào cuối. Hãy kiềm chế, tránh làm việc này.
11.4 Thêm các constructor
Constructor có thể được chồng chất [xem thêm phần “Quá tải”], cũng như các phương thức khác, theo nghĩa bạn có thể có nhiều constructor với các tham số khác nhau. Java biết rõ cần phải kích hoạt constructor nào bằng cách khớp những tham số của
`new` với các tham số của constructor.
Việc có constructor không nhận đối số (như trên) là hoàn toàn bình thường, cũng như constructor nhận một danh sách tham số giống hệt với danh sách các biến thực thể. Chẳng hạn:
public Time(int hour, int minute, double second) { this.hour = hour; this.minute = minute; this.second = second; }
Các tên và kiểu của những tham số cũng giống với tên và kiểu của các biến thực thể. Tất cả những gì mà constructor này làm chỉ là sao chép thông tin từ các tham số sang các biến thực thể.
Nếu xem tài liệu về
`Point` và `Rectangle`, bạn sẽ thấy rằng cả hai lớp này đều có những constructor kiểu như trên. Việc chồng chất constructor cho phép linh hoạt tạo nên đối tượng trước rồi sau đó mới điền vào phần trống, hoặc để thu thập toàn bộ thông tin trước khi lập ra đối tượng.
Điều này nghe thì có vẻ không đáng quan tâm, song thực ra thì khác. Việc viết những constructor là quá trình máy móc, buồn tẻ. Một khi bạn đã viết được hai constructor rồi, bạn sẽ thấy rằng mình có thể viết chúng nhanh chóng chỉ qua việc trông vào danh sách các biến thực thể.
11.5 Tạo nên đối tượng mới
Mặc dù trông giống như phương thức, song constructor không bao giờ được kích hoạt trực tiếp. Thay vì vậy, khi bạn kích hoạt
`new`, hệ thống sẽ huy động dung lượng bộ nhớ cho đối tượng mới và kích hoạt constructor này.
Chương trình sau giới thiệu hai cách làm để lập thành và khởi tạo các đối tượng
`Time`:
class Time { int hour, minute; double second; public Time() { this.hour = 0; this.minute = 0; this.second = 0.0; } public Time(int hour, int minute, double second) { this.hour = hour; this.minute = minute; this.second = second; } public static void main(String[] args) { // một cách lập thành và khởi tạo đối tượng Time Time t1 = new Time(); t1.hour = 11; t1.minute = 8; t1.second = 3.14159; System.out.println(t1); // một cách khác để thực hiện việc tương tự Time t2 = new Time(11, 8, 3.14159); System.out.println(t2); } }
Trong
`main`, lần đầu tiên kích hoạt `new`, ta không cấp cho đối số nào, bởi vậy Java kích hoạt constructor thứ nhất. Vài dòng phía dưới thực hiện gán giá trị cho các biến thực thể.
Lần thứ hai kích hoạt
`new`, ta cấp các đối số khớp với các tham số của constructor thứ hai. Cách khởi tạo biến thực thể này gọn gàng hơn và hiệu quả hơn một chút, song cách làm này có thể khó đọc, bởi nó không rõ ràng là giá trị nào được gán cho biến thực thể nào.
11.6 In các đối tượng
Kết quả của chương trình nêu trên là:
Time@80cc7c0 Time@80cc807
Khi Java in giá trị của kiểu đối tượng do người dùng định nghĩa, nó sẽ in tên kiểu cùng một mã thập lục phân đặc biệt riêng của từng đối tượng. Mã này bản thân nó chẳng có ý nghĩa gì; thực tế nó khác nhau tuỳ máy tính và thậm chí tuỳ cả những lần chạy chương trình. Nhưng có thể nó giúp ích cho việc gỡ lỗi, trong trường hợp bạn muốn theo dõi từng đối tượng riêng rẽ.
Để in các đối tượng theo cách có ý nghĩa hơn đối với người dùng (chứ không phải đối với lập trình viên), bạn có thể viết một phương thức với tên gọi kiểu như
`printTime`:
public static void printTime(Time t) { System.out.println(t.hour + ":" + t.minute + ":" + t.second); }
Hãy so sánh phương thức này với phiên bản
`printTime` ở Mục 3.10.
Kết quả của phương thức này, nếu ta truyền
`t1` hoặc `t2` làm đối số, sẽ là `11:8:3.14159`. Mặc dù ta có thể nhận ra đây là giờ đồng hồ, nhưng cách viết này không hề theo chuẩn quy định. Chẳng hạn, nếu số phút hoặc số giây nhỏ hơn 10, ta sẽ luôn dự kiển rằng có số `0` đi trước. Ngoài ra, có thể ta còn muốn bỏ phần thập phân của số giây đi. Nói cách khác, ta muốn kết quả kiểu như `11:08:03`.
Trong đa số những ngôn ngữ lập trình, có nhiều cách đơn giản để điều khiển định dạng đầu ra cho kết quả số. Trong Java thì không có cách đơn giản nào.
Java có những công cụ mạnh dành cho việc in dữ liệu được định dạng như giờ đồng hồ và ngày tháng, đồng thời cũng có công cụ để diễn giải dữ liệu vào được định dạng. Song thật không may là những công cụ như vậy không dễ sử dụng, nên tôi sẽ bỏ qua chúng trong khuôn khổ cuốn sách này. Nếu muốn, bạn có thể xem qua tài liệu của lớp
`Date` trong gói `java.util`.
11.7 Các thao tác với đối tượng
Trong một vài mục tiếp theo, tôi sẽ giới thiệu ba dạng phương thức hoạt động trên các đối tượng:
**hàm thuần tuý:**
- Nhận các đối tượng làm tham số nhưng không thay đổi chúng. Giá trị trả lại thuộc kiểu nguyên thuỷ hoặc một đối tượng mới tạo ra bên trong phương thức này.
**phương thức sửa đổi:**
- Nhận đối số là các đối tượng rồi sửa đổi một vài, hoặc tất cả những đối tượng đó. Thường trả lại đối tượng rỗng (void).
**phương thức điền:**
- Một trong các đối số là đối tượng “trống trơn” sẽ được phương thức điền thông tin vào. Về mặt kĩ thuật, đây cũng chính là một dang phương thức sửa đổi.
Với một phương thức cho trước ta thường có thể viết nó dưới dạng hàm thuần túy, phương thức sửa đổi hay phương thức điền. Tôi sẽ bàn thêm về ưu nhược điểm của từng hình thức một.
11.8 Các hàm thuần túy
Một phương thức được coi là hàm thuần túy nếu như kết quả chỉ phụ thuộc vào các đối số, và phương thức này không có hiệu ứng phụ như thay đổi một đối số hoặc in ra thông tin gì. kết quả duy nhất của việc kích hoạt một hàm thuần túy, đó là giá trị trả lại.
Một ví dụ là
`isAfter`, để so sánh hai đối tượng `Time` rồi trả lại một `boolean` để chỉ định xem liệu toán hạng thứ nhất có xếp trước toán hạng thứ hai hay không:
public static boolean isAfter(Time time1, Time time2) { if (time1.hour > time2.hour) return true; if (time1.hour < time2.hour) return false; if (time1.minute > time2.minute) return true; if (time1.minute < time2.minute) return false; if (time1.second > time2.second) return true; return false; }
Kết quả của phương thức này sẽ là gì nếu hai thời gian đã cho bằng nhau? Liệu đó có phải là kết quả phù hợp đối với phương thức này không? Nếu bạn viết tài liệu cho phương thức này, liệu bạn có đề cập rõ đến trường hợp đó không?
Ví dụ thứ hai là
`addTime`, phương thức tính tổng hai thời gian. Chẳng hạn, nếu bây giờ là `9:14:30`, và người làm bánh cần 3 giờ 35 phút, thì bạn có thể dùng `addTime` để hình dung ra khi nào bánh ra lò.
Sau đây là bản sơ thảo của phương thức này; nó chưa thật đúng:
public static Time addTime(Time t1, Time t2) { Time sum = new Time(); sum.hour = t1.hour + t2.hour; sum.minute = t1.minute + t2.minute; sum.second = t1.second + t2.second; return sum; }
Mặc dù phương thức này trả lại một đối tượng
`Time`, song nó không phải là constructor. Bạn cần xem lại và so sánh cú pháp của một phương thức dạng này với cú pháp của một constructor, vì chúng dễ gây nhầm lẫn.
Sau đây là một ví dụ về cách dùng phương thức. Nếu như
`currentTime` chứa thời gian hiện tại và `breadTime` chứa thời gian cần để người thợ nướng bánh, thì bạn có thể dùng `addTime` để hình dung ra khi nào sẽ nướng xong bánh.
Time currentTime = new Time(9, 14, 30.0); Time breadTime = new Time(3, 35, 0.0); Time doneTime = addTime(currentTime, breadTime); printTime(doneTime);
Kết quả của chương trình,
`12:49:30.0`, là đúng. Mặt khác, cũng có những trường hợp mà kết quả không đúng. Bạn có đoán được một trường hợp như vậy không?
Vấn đề là ở chỗ phương thức này không xử lý được tình huống khi số giây hoặc số phút cộng lại vượt quá 60. Trong trường hợp đó, ta phải “nhớ” số giây còn dư vào cột số phút, hoặc nhớ số phút dư vào cột giờ.
Sau đây là một dạng đúng của phương thức này.
public static Time addTime(Time t1, Time t2) { Time sum = new Time(); sum.hour = t1.hour + t2.hour; sum.minute = t1.minute + t2.minute; sum.second = t1.second + t2.second; if (sum.second >= 60.0) { sum.second -= 60.0; sum.minute += 1; } if (sum.minute >= 60) { sum.minute -= 60; sum.hour += 1; } return sum; }
Mặc dù cách này đúng, song chương trình bắt đầu dài dòng. Sau này tôi sẽ gợi ý một giải pháp khác ngắn hơn nhiều.
Đoạn mã lệnh trên giới thiệu hai toán tử mà ta chưa từng gặp,
`+=` và `-=`. Những toán tử này cho ta viết ngắn gọn lệnh tăng hoặc giảm biến. Chúng cũng gần giống như `++` và `--`, chỉ khác ở chỗ (1) chúng làm việc được cả với `double` lẫn `int`, và (2) lượng tăng hoặc giảm không nhất thiết bằng 1. Câu lệnh `sum.second -= 60.0;` tương đương với `sum.second = sum.second - 60;`
11.9 Phương thức sửa đổi
Xét một ví dụ về phương thức sửa đổi, phương thức
`increment`, nhằm tăng thêm một số giây cho trước vào một đối tượng `Time`. Một lần nữa, ta có bản nháp phương thức này như sau:
public static void increment(Time time, double secs) { time.second += secs; if (time.second >= 60.0) { time.second -= 60.0; time.minute += 1; } if (time.minute >= 60) { time.minute -= 60; time.hour += 1; } }
Dòng đầu tiên thực hiện thao tác cơ bản; những dòng còn lại để xử lý các trường hợp ta đã xét.
Liệu phương thức này có đúng không? Điều gì sẽ xảy ra nếu đối số
`secs` lớn hơn nhiều so với 60? Trong trường hợp như vậy, trừ đi 60 một lần là chưa đủ; ta phải tiếp tục trừ đến khi `second` nhỏ hơn 60. Ta có thể làm điều này bằng cách thay các lệnh `if` bằng các lệnh `while`:
public static void increment(Time time, double secs) { time.second += secs; while (time.second >= 60.0) { time.second -= 60.0; time.minute += 1; } while (time.minute >= 60) { time.minute -= 60; time.hour += 1; } }
Giải pháp này đúng đắn, nhưng chưa hiệu quả lắm. Bạn có thể nghĩ ra lời giải nào không cần đến tính lặp hay không?
11.10 Các phương thức điền
Thay vì việc tạo nên đối tượng mới mỗi khi
`addTime` được kích hoạt, ta có thể yêu cầu chương trình gọi hãy cung cấp một đối tượng nơi mà `addTime` lưu kết quả. Hãy so sánh đoạn mã sau với phiên bản trước:
public static void addTimeFill(Time t1, Time t2, Time sum) { sum.hour = t1.hour + t2.hour; sum.minute = t1.minute + t2.minute; sum.second = t1.second + t2.second; if (sum.second >= 60.0) { sum.second -= 60.0; sum.minute += 1; } if (sum.minute >= 60) { sum.minute -= 60; sum.hour += 1; } }
Kết quả được lưu trong
`sum`, nên kiểu trả về là `void`.
Các phương thức sửa đổi và phương thức điền đều hiệu quả vì chúng không phải tạo nên đối tượng mới. Nhưng chúng lại gây khó khăn trong việc cô lập các phần khác nhau của chương trình; trong những dự án lớn chúng có thể gây nên lỗi rất khó tìm ra.
Các hàm thuần túy giúp ta quản lý tính chất phức tạp của những dự án lớn, phần là nhờ ngăn không cho những loại lỗi nhất định không thể xảy ra. Hơn nữa, hàm thuần túy còn thích hợp với những kiểu lập trình ghép và lồng. Và vì kết quả của hàm thuần túy chỉ phụ thuộc vào tham số, ta có thể tăng tốc cho nó bằng cách lưu giữ những giá trị đã tính toán từ trước.
Tôi gợi ý rằng bạn nên viết hàm thuần túy mỗi lúc thấy được, và chỉ dùng đến phương thức sửa đổi khi thấy rõ ưu điểm vượt trội.
11.11 Lập kế hoạch và phát triển tăng dần
Trong chương trình này tôi giới thiệu một quá trình phát triển chương trình với tên gọi
**lập nguyên mẫu nhanh** . Với từng phương thức, tôi viết một bản sơ thảo để thực hiện tính toán cơ bản, rồi kiểm tra nó với một vài trường hợp, sửa những lỗi bắt gặp được. 1
Cách tiếp cận này có thể hiệu quả, song nó có thể dẫn đến mã lệnh phức tạp một cách không cần thiết—vì nó xử lý quá nhiều trường hợp đặc biệt—và cũng kém tin cậy—vì thật khó tự thuyết phục rằng bạn đã tìm thấy
*tất cả* những lỗi trong chương trình.
Một cách khác là xem xét kĩ hơn vấn đề nhằm tìm mấu chốt có thể giúp việc lập trình dễ dàng hơn. Trong trường hợp này điểm mấu chốt bên trong là:
`Time` thực ra là một số có ba chữ số trong hệ cơ số 60! Số giây, `second`, là hàng đơn vị, số phút, `minute`, là hàng 60, còn số giờ, `hour`, là hàng 3600.
Khi ta viết
`addTime` và `increment`, thực chất là ta đang tính cộng ở hệ 60; đó là lý do tại sao ta phải “nhớ” từ hàng này sang hàng khác.
Một cách tiếp cận khác đối với tổng thể bài toán là chuyển
`Time` thành `double` rồi lợi dụng khả năng tính toán của máy đối với `double`. Sau đây là một phương thức chuyển đổi `Time` thành `double`:
public static double convertToSeconds(Time t) { int minutes = t.hour * 60 + t.minute; double seconds = minutes * 60 + t.second; return seconds; }
Bây giờ tất cả những gì ta cần là cách chuyển từ
`double` sang đối tượng `Time`. Ta có thể viết một phương thức để thực hiện điều này, song có lẽ hợp lý hơn la viết một constructor thứ ba:
public Time(double secs) { this.hour =(int)(secs / 3600.0); secs -= this.hour * 3600.0; this.minute =(int)(secs / 60.0); secs -= this.minute * 60; this.second = secs; }
Constructor này hơi khác những constructor khác; nó bao gồm những tính toán bên cạnh phép gán cho các biến thực thể.
Có thể bạn phải suy nghĩ để tự thuyết phục bản thân rằng kĩ thuật mà tôi dùng để chuyển từ hệ cơ số này sang cơ số kia là đúng. Nhưng một khi bạn đã bị thuyết phục rồi, ta có thể dùng những phương thức này để viết lại
`addTime`:
public static Time addTime(Time t1, Time t2) { double seconds = convertToSeconds(t1) + convertToSeconds(t2); return new Time(seconds); }
Mã lệnh trên ngắn hơn phiên bản gốc, và dễ thấy hơn hẳn rằng mã lệnh này đúng đắn (với giả thiết thường lệ rằng những phương thức nó kích hoạt cũng đều đúng). Việc viết lại
`increment` theo cách tương tự được dành cho bạn như một bài tập.
11.12 Khái quát hóa
Trong chừng mực nào đó, việc chuyển đổi qua lại giữa các hệ cơ số 60 và 10 khó hơn việc xử lý thời gian đơn thuần. Việc chuyển hệ cơ số thì trừu tượng hơn, còn trực giác của ta xử lý thời gian tốt hơn.
Nhưng nếu ta có hiểu biết sâu để coi thời gian như các số trong hệ 60, và đầu tư công sức viết những phương thức chuyển đổi (
`convertToSeconds` và constructor thứ ba), ta sẽ thu được một chương trình ngắn hơn, dễ đọc và gỡ lỗi, đồng thời đáng tin cậy hơn.
Việc bổ sung các đặc tính sau này cũng dễ dàng hơn. Hãy tưởng tượng ta cần trừ hai đối tượng
`Time` để tìm ra khoảng thời gian giữa chúng. Cách làmthực hiện tính trừ có nhớ. Nhưng dùng phương thức để chuyển đổi sẽ dễ hơn nhiều.
Điều trớ trêu là, đôi khi việc làm cho bài toán khó hơn (tổng quát hơn) lại khiến cho dễ dàng hơn (ít trường hợp đặc biệt, ít khả năng gây ra lỗi).
11.13 Thuật toán
Khi bạn viết một lời giải tổng quát cho một lớp các bài toán, thay vì tìm lời giải riêng cho một bài toán riêng lẻ, bạn đã viết một
**thuật toán**. Thật không dễ định nghĩa thuật ngữ này, bởi vậy tôi sẽ cố gắng thử vài cái tiếp cận khác nhau.
Trước hết, hãy xét một số thứ không phải là thuật toán. Khi bạn học tính nhân giữa hai số, có lẽ bạn đã ghi nhớ bản cửu chương. Thật ra, bạn đã học thuộc lòng 100 lời giải cụ thể, bởi vậy kiến thức này thực sự không phải là thuật toán.
Nhưng nếu bạn “lười biếng,” có thể bạn đã học hỏi được mấy mẹo vặt. Chẳng hạn, để tính tính của một số
*n* với 9, bạn có thể viết *n*−1 là chữ số thứ nhất và 10− *n* là chữ số thứ hai. Mẹo này là lời giải tổng quát để nhân một số dưới mười bất kì với 9. Đó chính là thuật toán!
Tương tự, những kĩ thuật bạn học để cộng có nhớ, trừ có nhớ, và phép chia số lớn đều là những thuật toán. Một trong những đặc điểm của thuật toán là chúng không cần trí thông minh để thực hiện. Chúng chỉ là những cơ chế máy móc trong đó từng bước nối tiếp nhau theo một loạt những nguyên tắc đơn giản.
Theo ý kiến của tôi, thật đáng ngại khi thấy rằng chúng ta dành quá nhiều thời gian trên lớp để học cách thực hiện những thuật toán mà, nói thẳng ra là, không cần trí thông minh gì cả. Mặt khác, quá trình thiết kế những thuật toán lại thú vị, đầy thử thách trí tuệ, và là phần trung tâm của việc mà ta gọi là lập trình.
Có những việc mà con người làm theo lẽ tự nhiên, chẳng khó khăn hay phải suy nghĩ gì, lại là những thứ khó biểu diễn bằng thuật toán nhất. Việc hiểu ngôn ngữ là một ví dụ điển hình. Chúng ta ai cũng làm vậy, nhưng đến nay chưa ai giải thích được rằng ta làm vậy
*bằng cách nào*, ít nhất là biểu diễn dưới dạng thuật toán.
Bạn sẽ sớm có cơ hội thiết kế những thuật toán đơn giản cho nhiều bài toán khác nhau.
11.14 Thuật ngữ **lớp:**
- Trước đây, tôi đã định nghĩa lớp là một tập hợp các phương thức có liên quan. Trong chương này ta còn được biết rằng lời định nghĩa lớp cũng đồng thời là một bản mẫu của một kiểu đối tượng mới.
**thực thể:**
- Thành viên của một lớp. Mỗi đối tượng đều là thực thể của một lớp nào đó.
**constructor:**
- Một phương thức đặc biệt để khởi tạo các biến thực thể của một đối tượng mới lập nên.
**lớp khởi động:**
- Lớp có chứa phương thức
`main`nơi bắt đầu việc thực thi chương trình. **hàm thuần túy:**
- Phương thức mà kết quả chỉ phụ thuộc vào các tham số của nó, và không gây hiệu ứng phụ nào ngoài việc trả lại một giá trị.
**phương thức sửa đổi:**
- Phương thức làm thay đổi một hay nhiều đối tượng nhận làm tham số, và thường trả lại
`void`. **phương thức điền:**
- Kiểu phương thức nhận tham số là một đối tượng “trống không” và điền vào những biến thực thể của nó thay vì việc phát sinh một giá trị trả lại.
**thuật toán:**
- Một loạt những chỉ dẫn nhằm giải một lớp các bài toán theo một quá trình máy móc.
11.15 Bài tập **Bài tập 1** , mỗi miếng vuông để xếp lên bàn sẽ chứa một chữ cái, để xêm nên các từ có nghĩa, và đồng thời có một điểm số; từ đó ta tính được điểm cho các từ khác nhau. 2
- Hãy viết một định nghĩa lớp có tên
`Tile`để biểu diễn các miếng vuông Scrabble. Các biến thực thể sẽ gồm một kí tự có tên `letter`và một số nguyên có tên `value`.
- Hãy viết một constructor để nhận các tham số
`letter`và `value`rồi khởi tạo các biến thực thể.
- Viết một phương thức có tên
`printTile`để nhận tham số là một đối tượng `Tile`rồi in ra các biến thực thể dưới định dạng mà người thường có thể đọc được.
- Viết một phương thức có tên
`testTile`để tạo nên một đối tượng Tile có chữ cái `Z`và giá trị 10, rồi dùng `printTile`để in ra trạng thái của đối tượng này.
Mục đích của bài tập này là để luyện tập phần cơ chế tạo nên một lời định nghĩa lớp và mã lệnh để kiểm tra nó.
**Bài tập 2** *Hãy viết một định nghĩa lớp của* `Date`, một kiểu đối tượng bao gồm ba số nguyên là `year`, `month`và `day`. Lớp này cần phải có hai constructor. Constructor thứ nhất không nhận tham số nào. Constructor thứ hai nhận các tham số mang tên `year`, `month`và `day`, rồi dùng chúng để khởi tạo các biến thực thể. Hãy viết một phương thức `main`để tạo nên một đối tượng `Date`mới có tên `birthday`. Đối tượng mới này để chứa ngày sinh nhật của bạn. Có thể dùng constructor nào cũng được. **Bài tập 3** [Phân số là số có thể biểu điễn được dưới dạng tỉ số giữa hai số nguyên. Chẳng hạn, 2/3 là một phân số, và bạn cũng có thể coi 7 là một phân số với mẫu số ngầm định bằng 1. Ở bài tập này, bạn sẽ viết một lời định nghĩa lớp cho các phân số.]
- Lập một chương trình mới có tên
`Rational.java`để định nghĩa một lớp tên là `Rational`. Một đối tượng `Rational`phải có hai biến thực thể số nguyên để lưu trữ tử số và mẫu số.
- Viết một constructor không nhận tham số nào để đặt tử số bằng 0 và mẫu số bằng 1.
- Viết một phương thức có tên
`printRational`để nhận vào đối số là một đối tượng Rational rồi in nó ra theo định dạng hợp lý.
- Viết một phương thức
`main`để lập nên một đối tượng mới có kiểu là Rational, đặt các biến thực thể của nó bằng giá trị cụ thể, rồi in đối tượng này ra.
- Đến đây, bạn đã có một chương trình tối thiểu có thể chạy thử được. Hãy chạy để kiểm tra nó, và gỡ lỗi, nếu cần.
- Viết một constructor thứ hai cho lớp này có nhận vào hai đối số rồi sử dụng chúng để khởi tạo các biến thực thể.
- Hãy viết một phương thức có tên
`negate`để đảo dấu của phân số. Phương thức này phải là một phân thức sửa đổi, và vì vậy cần phải trả lại `void`. Hãy viết thêm dòng lệnh trong `main`để kiểm tra phương thức mới này.
- Viết một phương thức có tên
`invert`để nghịch đảo số bằng cách tráo đổi tử số và mẫu số. Hãy viết thêm dòng lệnh trong `main`để kiểm tra phương thức mới này.
- Viết một phương thức có tên
`toDouble`để chuyển đổi phân số thành một số double (số dấu phẩy động) rồi trả lại kết quả. Phương thức này là một hàm thuần tuý; nó không thay đổi đối tượng. Như thường lệ, hãy kiểm tra phương thức mới viết.
- Viết một phương thức có tên
`reduce`để rút gọn một phân số về dạng tối giản bằng cách tìm ước số chung lớn nhất của tử số và mẫu số rồi cùng chia cả tử lẫn mẫu cho ước chung này. Phương thức nêu trên phải là một hàm thuần tuý; nó không được phép thay đổi các biến thực thể của đối tượng mà nó được kích hoạt lên. Để tính ước số chung lớn nhất, hãy xem Bài tập 10 của Chương 6).
- Viết một phương thức có tên
`add`để nhận hai đối số là hai Rational rồi trả lại một đối tượng Rational mới. Đối tượng được trả lại phải chứa tổng của các đối số. có vài cách thực hiện phép cộng này. Bạn có thể dùng bất kì cách nào, nhưng hãy đảm bảo rằng kết quả của phép tính phải được rút gọn sao cho tử và mẫu không có ước số chung nào khác (ngoài 1).
Mục đích của bài tập này là nhằm viết một lời định nghĩa hàm có chứa nhiều loại phương thức, bao gồm constructors, phương thức sửa đổi, và hàm thuần tuý.
[1](http://greenteapress.com/thinkapjava/html/thinkjava013.html#text4)
- Cái mà tôi gọi là “nguyên mẫu nhanh” (rapid prototyping) ở đây rất giống với cách phát triển dựa trên kiểm thử (test-driven development, TDD); sự khác biệt là ở chỗ TDD thường dựa trên kiểm thử tự động. Xem
`.` [http://en.wikipedia.org/wiki/Test-driven_development](http://en.wikipedia.org/wiki/Test-driven_development) [2](http://greenteapress.com/thinkapjava/html/thinkjava013.html#text5)
- Scrabble là một nhãn hiệu đã đăng kí ở Hoa Kì và Canada, thuộc về cty Hasbro Inc., và ở các nước còn lại trên thế giới, thì thuộc về J.W. Spear & Sons Limited ở Maidenhead, Berkshire, Anh Quốc, công ty nhánh của Mattel Inc.
## 3 responses to “
Chương 11: Tự tạo nên những đối tượng riêng”
Pingback: Think Java: Cách suy nghĩ như nhà khoa học máy tính | Blog của Chiến
“Để tính ước số chung lớn nhất, hãy xem Bài tập 10 của Chương 8)”.nghiêm túc đấy chứ ?
Đúng ra là Bài tập 10 của Chương 6. Cám ơn bạn đã phát hiện ra lỗi sai.

Link: <http://wp.me/p1kFN-wG>; rel=shortlink


text:
Nếu muốn tỏa sáng trong tương lai, bạn phải lấp lánh từ hôm nay.Sưu tầm
Thành công không phải điểm cuối cùng, thất bại không phải là kết thúc, chính sự dũng cảm tiếp tục công việc mới là điều quan trọng. (Success is not final, failure is not fatal: it is the courage to continue that counts.)Winston Churchill
Khi bạn dấn thân hoàn thiện các nhu cầu của tha nhân, các nhu cầu của bạn cũng được hoàn thiện như một hệ quả.Đức Đạt-lai Lạt-ma XIV
Không có sự việc nào tự thân nó được xem là tốt hay xấu, nhưng chính tâm ý ta quyết định điều đó. (There is nothing either good or bad but thinking makes it so.)William Shakespeare
Chúng ta sống bằng những gì kiếm được nhưng tạo ra cuộc đời bằng những gì cho đi. (We make a living by what we get, we make a life by what we give. )Winston Churchill
Hãy nhớ rằng hạnh phúc nhất không phải là những người có được nhiều hơn, mà chính là những người cho đi nhiều hơn. (Remember that the happiest people are not those getting more, but those giving more.)H. Jackson Brown, Jr.
Nếu muốn có những điều chưa từng có, bạn phải làm những việc chưa từng làm.Sưu tầm
Tinh cần giữa phóng dật, tỉnh thức giữa quần mê.Người trí như ngựa phi, bỏ sau con ngựa hèn.Kính Pháp Cú (Kệ số 29)
Như đá tảng kiên cố, không gió nào lay động, cũng vậy, giữa khen chê, người trí không dao động.Kinh Pháp cú (Kệ số 81)
Như bông hoa tươi đẹp, có sắc lại thêm hương; cũng vậy, lời khéo nói, có làm, có kết quả.Kinh Pháp cú (Kệ số 52)
Giặc phiền não thường luôn rình rập giết hại người, độc hại hơn kẻ oán thù. Sao còn ham ngủ mà chẳng chịu tỉnh thức?Kinh Lời dạy cuối cùng
Trang chủ »» Danh mục »» Đại từ điển Hán Việt »» Đang xem mục từ: lại trị - 吏治 »»
Chú ý: Nếu quý vị copy chữ Hán dán (paste) vào đây để tra thì kết quả sẽ chính xác hơn rất nhiều.
Quý vị cũng có thể bôi đen (select) những chữ Hán đã hiển thị trên màn hình rồi dùng chuột kéo thả vào khung để tra.
Chỉ chung công việc của các chức việc tại phủ quan địa phương. (Từ điển Nguyễn Quốc Hùng)
Quý vị đang truy cập từ IP 54.146.41.3 và chưa ghi danh hoặc đăng nhập trên máy tính này. Nếu là thành viên, quý vị chỉ cần đăng nhập một lần duy nhất trên thiết bị truy cập, bằng email và mật khẩu đã chọn.
Chúng tôi khuyến khích việc ghi danh thành viên ,để thuận tiện trong việc chia sẻ thông tin, chia sẻ kinh nghiệm sống giữa các thành viên, đồng thời quý vị cũng sẽ nhận được sự hỗ trợ kỹ thuật từ Ban Quản Trị trong quá trình sử dụng website này.
Việc ghi danh là hoàn toàn miễn phí và tự nguyện.
Ghi danh hoặc đăng nhập

markdown:
Nếu muốn tỏa sáng trong tương lai, bạn phải lấp lánh từ hôm nay.Sưu tầm
Thành công không phải điểm cuối cùng, thất bại không phải là kết thúc, chính sự dũng cảm tiếp tục công việc mới là điều quan trọng. (Success is not final, failure is not fatal: it is the courage to continue that counts.)Winston Churchill
Khi bạn dấn thân hoàn thiện các nhu cầu của tha nhân, các nhu cầu của bạn cũng được hoàn thiện như một hệ quả.Đức Đạt-lai Lạt-ma XIV
Không có sự việc nào tự thân nó được xem là tốt hay xấu, nhưng chính tâm ý ta quyết định điều đó. (There is nothing either good or bad but thinking makes it so.)William Shakespeare
Chúng ta sống bằng những gì kiếm được nhưng tạo ra cuộc đời bằng những gì cho đi. (We make a living by what we get, we make a life by what we give. )Winston Churchill
Hãy nhớ rằng hạnh phúc nhất không phải là những người có được nhiều hơn, mà chính là những người cho đi nhiều hơn. (Remember that the happiest people are not those getting more, but those giving more.)H. Jackson Brown, Jr.
Nếu muốn có những điều chưa từng có, bạn phải làm những việc chưa từng làm.Sưu tầm
Tinh cần giữa phóng dật, tỉnh thức giữa quần mê.Người trí như ngựa phi, bỏ sau con ngựa hèn.Kính Pháp Cú (Kệ số 29)
Như đá tảng kiên cố, không gió nào lay động, cũng vậy, giữa khen chê, người trí không dao động.Kinh Pháp cú (Kệ số 81)
Như bông hoa tươi đẹp, có sắc lại thêm hương; cũng vậy, lời khéo nói, có làm, có kết quả.Kinh Pháp cú (Kệ số 52)
Giặc phiền não thường luôn rình rập giết hại người, độc hại hơn kẻ oán thù. Sao còn ham ngủ mà chẳng chịu tỉnh thức?Kinh Lời dạy cuối cùng
[Trang chủ](Home.html) »»
[Danh mục](danh-muc_thu-vien_tongquat_rong-mo-tam-hon.html) »»
[Đại từ điển Hán Việt](tu-dien_han-viet_none_rong-mo-tam-hon.html) »»
Đang xem mục từ: lại trị - 吏治 »»
**Chú ý**: Nếu quý vị copy chữ Hán dán (paste) vào đây để tra thì kết quả sẽ chính xác hơn rất nhiều.
Quý vị cũng có thể bôi đen (select) những chữ Hán đã hiển thị trên màn hình rồi dùng chuột kéo thả vào khung để tra.
Chỉ chung công việc của các chức việc tại phủ quan địa phương. (
*Từ điển Nguyễn Quốc Hùng*) **Quý vị đang truy cập từ IP 54.146.41.3 và chưa ghi danh hoặc đăng nhập trên máy tính này. **Nếu là thành viên, quý vị chỉ cần đăng nhập một lần duy nhất trên thiết bị truy cập, bằng email và mật khẩu đã chọn.
Chúng tôi khuyến khích việc
**ghi danh thành viên **,để thuận tiện trong việc chia sẻ thông tin, chia sẻ kinh nghiệm sống giữa các thành viên, đồng thời quý vị cũng sẽ nhận được sự hỗ trợ kỹ thuật từ Ban Quản Trị trong quá trình sử dụng website này.
** Việc ghi danh là hoàn toàn miễn phí và tự nguyện**.
Ghi danh hoặc đăng nhập

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

Server: nginx/1.4.6 (Ubuntu)

Content-Type: text/html

Connection: close


text:
Cha mẹ Nhật nuôi dạy con như thế nào tập 1.
Thương hiệu: Alphabook | Mã hàng: SD-B1224
- Tác giả : Shichida Makoto
- NXB Dân trí.
- Kích thước 13 x 20.5 cm
Sản phẩm đã Hết hàng
Cuốn sách Cha Mẹ Nhật Nuôi Dạy Con Như Thế Nào cung cấp cho những bậc làm cha làm mẹ những kiến thức hữu ích nhất và những phương pháp giáo dục tối ưu nhất để cha mẹ có thể nuôi dạy con mình khoa học và giúp con trẻ trưởng thành về mọi mặt. Cha mẹ nào cũng muốn đem lại cho con mình những thứ tốt đẹp nhất và mong muốn con mình có thể phát triển được toàn diện về mọi mặt khi bé lớn lên.
Bộ sách Cha mẹ Nhật nuôi dạy con như thế nào được viết bởi Shichida Makoto - một tiến sĩ về giáo dục có tên tuổi tại Nhật Bản. Trong các cuốn sách của mình, tư tưởng xuyên suốt mà ông đề cập đến là tôn trọng trẻ, coi mỗi đứa trẻ là một thiên tài. Thời kỳ quan trọng nhất để giúp trẻ học hỏi và phát triển là giai đoạn từ 0-6 tuổi, khi đó trẻ có năng lực tiếp nhận đặc biệt và sẽ mất dần khi trẻ trưởng thành. Bởi vậy ông khuyến khích các ông bố, bà mẹ chú trọng tới phương pháp giáo dục trẻ trong giai đoạn này.
Vài nét về tác giả:
Shichida Makoto sinh năm 1929 tại Nhật Bản. Ông có bằng tiến sĩ về giáo dục. Trong hơn 40 năm phát triển sự nghiệp ông đã thành lập được hơn 400 viện giáo dục trẻ em. Và ông đã viết hơn 100 cuốn sách, và một số sách lọt vào danh sách bán chạy nhất Nhật Bản.
Hiện nay sách của ông được dịch ra nhiều thứ tiếng và nhiều người áp dụng phương pháp nuôi d���y trẻ thành công nhờ sách của ông.

markdown:
# Cha mẹ Nhật nuôi dạy con như thế nào tập 1.
Thương hiệu:
[Alphabook](/thuong-hieu/alphabook)
|
Mã hàng: SD-B1224
- Tác giả : Shichida Makoto
- NXB Dân trí.
- Kích thước 13 x 20.5 cm
Sản phẩm đã Hết hàng
Cuốn sách
** Cha Mẹ Nhật Nuôi Dạy Con Như Thế Nào** cung cấp cho những bậc làm cha làm mẹ những kiến thức hữu ích nhất và những phương pháp giáo dục tối ưu nhất để cha mẹ có thể nuôi dạy con mình khoa học và giúp con trẻ trưởng thành về mọi mặt. Cha mẹ nào cũng muốn đem lại cho con mình những thứ tốt đẹp nhất và mong muốn con mình có thể phát triển được toàn diện về mọi mặt khi bé lớn lên.
Bộ sách
**Cha mẹ Nhật nuôi dạy con như thế nào** được viết bởi Shichida Makoto - một tiến sĩ về giáo dục có tên tuổi tại Nhật Bản. Trong các cuốn sách của mình, tư tưởng xuyên suốt mà ông đề cập đến là tôn trọng trẻ, coi mỗi đứa trẻ là một thiên tài. Thời kỳ quan trọng nhất để giúp trẻ học hỏi và phát triển là giai đoạn từ 0-6 tuổi, khi đó trẻ có năng lực tiếp nhận đặc biệt và sẽ mất dần khi trẻ trưởng thành. Bởi vậy ông khuyến khích các ông bố, bà mẹ chú trọng tới phương pháp giáo dục trẻ trong giai đoạn này.
## Vài nét về tác giả:
**Shichida Makoto** sinh năm 1929 tại Nhật Bản. Ông có bằng tiến sĩ về giáo dục. Trong hơn 40 năm phát triển sự nghiệp ông đã thành lập được hơn 400 viện giáo dục trẻ em. Và ông đã viết hơn 100 cuốn sách, và một số sách lọt vào danh sách bán chạy nhất Nhật Bản.
Hiện nay sách của ông được dịch ra nhiều thứ tiếng và nhiều người áp dụng phương pháp nuôi d���y trẻ thành công nhờ sách của ông.
|
|![]()
Bạn có muốn tạo tài khoản để cập nhật nhiều ưu đãi không ?

Cache-Control: private

Content-Type: text/html; charset=utf-8

Set-Cookie: _CookiesCustomerId=PC70EFAE31BC8A4,1; expires=Tue, 24-Apr-2018 11:24:02 GMT; path=/


text:
Ghế ngồi ô tô Malgotto Torino Combi màu trắng
Thương hiệu: Combi | Mã hàng: GA-182
- Tấm đỡ đầu điều chỉnh được 13 mức
- Chất liệu vải & lưới rất thoáng khí
- Tuổi sử dụng: sơ sinh - 7 tuổi
7.990.000đ
Dương Thị Hồng, Trương Thị Mai Thảo vừa mua thành công sản phẩm này.
Giao hàng toàn Quốc
Đổi hàng 15 ngày miễn phí
Đảm bảo hàng chính hãng
Ghế ngồi ô tô Malgotto Torino Combi màu trắng là dòng ghế ô tô sang trọng đem lại sự trải nghiệm tuyệt vời cho bé khi di chuyển bằng ô tô cùng gia đình. Khi cho bé cùng đi trên ô tô, ba mẹ cần tuyệt đối giữ an toàn cho bé.
Khi đưa bé đi chơi bằng xe hơi, việc quan tâm hàng đầu của các bậc phụ huynh là làm sao cho bé ngồi vừa vặn và an toàn trong khi ghế xe hơi quá to so với thân hình bé. Để giải quyết vấn đề này, những chiếc ghế nhỏ có thể gắn trực tiếp vào ghế trong xe hơi được ra đời. Ghế ngồi xe hơi cho bé Malgotto của Combi với thiết kế chuyên dụng, vừa vặn cho bé ngồi. Ghế ngồi ô tô cho bé Malgotto có chất liệu êm ái, bảo đảm sự thoải mái cho bé khi ngồi. Sản phẩm dành cho bé từ 0 – 7 tuổi.
Ghế ngồi trong ô tô trẻ em Malgotto được trang bị đệm ngồi Dacco với công nghệ "HO - COOLING" tiên tiến siêu thoáng khí, tản nhiệt và thấm hút mồ hôi tối đa đem lại sự thoải mái nhất cho bé khi ngồi.
Điểm nổi bật của ghế ngồi trong ô tô Malgotto cho bé màu trắng
Là dòng ghế ô tô sang trọng
Malgotto Roma là dòng ghế ô tô sang trọng đem lại sự trải nghiệm tuyệt vời cho bé khi di chuyển bằng ô tô cùng gia đình.
Dành cho trẻ từ sơ sinh - 7 tuổi
Malgotto Milano Roma mang tính kinh tế cao với thời gian sử dụng lâu dài, dành cho trẻ từ sơ sinh - 7 tuổi.
Tấm đỡ đầu điều chỉnh được 13 nấc
Tấm đỡ đầu điều chỉnh được 13 nấc khác nhau phù hợp với từng giai đoạn phát triển của bé.
Đem lại sự thông thoáng và sự thoải mái nhất cho bé
Malgotto Milano Roma được trang bị đệm ngồi Dacco với công nghệ "HO - COOLING" tiên tiến siêu thoáng khí, tản nhiệt và thấm hút mồ hôi tối đa đem lại sự thoải mái nhất cho bé khi ngồi.
Đệm ngồi êm ái
Với cấu tạo 3D thoáng khí giúp bé luôn cảm thấy dễ chịu ngay cả khi phải ngồi lâu trên ghế ô tô.
Dễ lắp ráp
Lắp đặt dễ dàng tiện lợi đối với mọi loại xe.
Khóa dây ghế ô tô được thiết kế với điểm báo xanh mỗi khi lắp đúng cách.
Đai an toàn điều chỉnh dễ dàng, phù hợp với từng giai đoạn phát triển của bé.
Thói quen của người Việt Nam là thường ôm con vào lòng nhưng như vậy sẽ không đảm bảo trong những trường hợp không may xảy ra. Các mẹ nên sắm cho bé một sản phẩm chuyên dùng đó là ghế ngồi ô tô cho bé giúp bé thoải mái khi ngồi trên xe và mẹ cũng luôn an tâm trên mọi nẻo đường.

markdown:
# Ghế ngồi ô tô Malgotto Torino Combi màu trắng
Thương hiệu:
[Combi](/thuong-hieu/combi)
|
Mã hàng: GA-182
- Tấm đỡ đầu điều chỉnh được 13 mức
- Chất liệu vải & lưới rất thoáng khí
- Tuổi sử dụng: sơ sinh - 7 tuổi
7.990.000đ
[](javascript:void(0)) *Mua hàng Vui lòng chọn Kích thước trước khi cho vào giỏ hàng Vui lòng chọn Màu trước khi cho vào giỏ hàng* [Xem địa chỉ 32 cửa hàng](javascript:void(0)) **Dương Thị Hồng, Trương Thị Mai Thảo** vừa mua thành công sản phẩm này.
Giao hàng toàn Quốc
Đổi hàng 15 ngày miễn phí
Đảm bảo hàng chính hãng
**1800 6066** **là dòng ghế ô tô sang trọng đem lại sự trải nghiệm tuyệt vời cho bé khi di chuyển bằng ô tô cùng gia đình. Khi cho bé cùng đi trên ô tô, ba mẹ cần tuyệt đối giữ an toàn cho bé. Ghế ngồi ô tô Malgotto Torino Combi màu trắng **
Khi đưa bé đi chơi bằng xe hơi, việc quan tâm hàng đầu của các bậc phụ huynh là làm sao cho bé ngồi vừa vặn và an toàn trong khi ghế xe hơi quá to so với thân hình bé. Để giải quyết vấn đề này, những chiếc ghế nhỏ có thể gắn trực tiếp vào ghế trong xe hơi được ra đời.
[Ghế ngồi xe hơi cho bé](/danh-muc/ghe-ngoi-o-to) Malgotto của Combi với thiết kế chuyên dụng, vừa vặn cho bé ngồi. Ghế ngồi ô tô cho bé Malgotto có chất liệu êm ái, bảo đảm sự thoải mái cho bé khi ngồi. Sản phẩm dành cho bé từ 0 – 7 tuổi. *Ghế ngồi trong ô tô trẻ em Malgotto được trang bị đệm ngồi Dacco với công nghệ "HO - COOLING" tiên tiến siêu thoáng khí, tản nhiệt và thấm hút mồ hôi tối đa đem lại sự thoải mái nhất cho bé khi ngồi.*
### Điểm nổi bật của ghế ngồi trong ô tô Malgotto cho bé màu trắng
**Là dòng ghế ô tô sang trọng**
Malgotto Roma là dòng ghế ô tô sang trọng đem lại sự trải nghiệm tuyệt vời cho bé khi di chuyển bằng ô tô cùng gia đình.
**Dành cho trẻ từ sơ sinh - 7 tuổi**
Malgotto Milano Roma mang tính kinh tế cao với thời gian sử dụng lâu dài, dành cho trẻ từ sơ sinh - 7 tuổi.
**Tấm đỡ đầu điều chỉnh được 13 nấc**
Tấm đỡ đầu điều chỉnh được 13 nấc khác nhau phù hợp với từng giai đoạn phát triển của bé.
**Đem lại sự thông thoáng và sự thoải mái nhất cho bé**
Malgotto Milano Roma được trang bị đệm ngồi Dacco với công nghệ "HO - COOLING" tiên tiến siêu thoáng khí, tản nhiệt và thấm hút mồ hôi tối đa đem lại sự thoải mái nhất cho bé khi ngồi.
**Đệm ngồi êm ái**
Với cấu tạo 3D thoáng khí giúp bé luôn cảm thấy dễ chịu ngay cả khi phải ngồi lâu trên ghế ô tô.
**Dễ lắp ráp**
Lắp đặt dễ dàng tiện lợi đối với mọi loại xe.
Khóa dây ghế ô tô được thiết kế với điểm báo xanh mỗi khi lắp đúng cách.
[Đai an toàn](/danh-muc/dai-xe-may-tre-em) điều chỉnh dễ dàng, phù hợp với từng giai đoạn phát triển của bé.
Thói quen của người Việt Nam là thường ôm con vào lòng nhưng như vậy sẽ không đảm bảo trong những trường hợp không may xảy ra. Các mẹ nên sắm cho bé một sản phẩm chuyên dùng đó là ghế ngồi ô tô cho bé giúp bé thoải mái khi ngồi trên xe và mẹ cũng luôn an tâm trên mọi nẻo đường.
**Thông tin chi tiết** ![ Ghế ngồi ô tô Malgotto Torino Combi màu trắng](https://media.shoptretho.com.vn/upload/image/product/20140310/ghe-ngoi-o-to-malgotto-torino-combi-mau-trang.jpg?mode=max&width=80&height=80)
[Tổng đài đặt hàng (08:00 - 21:30):](javascript:void(0)) *Mua hàng Vui lòng chọn Kích thước trước khi cho vào giỏ hàng Vui lòng chọn Màu trước khi cho vào giỏ hàng* **1800 6066**
|
|![]()
Bạn có muốn tạo tài khoản để cập nhật nhiều ưu đãi không ?

Set-Cookie: _CookiesCustomerId=PC4A316B0E49534,1; expires=Tue, 24-Apr-2018 11:39:05 GMT; path=/


text:
Từ ngày 11/7/2015 Shop Trẻ Thơ triển khai chương trình "Xả hàng trưng bày - Giá cực SỐC" tại hệ thống siêu thị Mẹ & Bé Shop Trẻ Thơ trên toàn quốc. Chương trình áp dụng cho khách hàng đến tham gia mua sắm trực tiếp tại các cửa hàng có trong danh sách dưới đây:
Để biết thêm thông tin chi tiết vui lòng liên hệ: www.ShopTreTho.com.vn – Hotline: 1900 6483

markdown:
Từ ngày 11/7/2015 Shop Trẻ Thơ triển khai chương trình "Xả hàng trưng bày - Giá cực SỐC" tại hệ thống siêu thị Mẹ & Bé Shop Trẻ Thơ trên toàn quốc. Chương trình áp dụng cho khách hàng đến tham gia mua sắm trực tiếp tại các cửa hàng có trong danh sách dưới đây:
Mã SẢN PHẨM TÊN SẢN PHẨM SỐ LƯỢNG GIÁ BÁN GIÁ THANH LÝ
|DCN-1083||Treo nôi ô tô Haba HB3894||2||550,000||220,000|
|DCN-589372||Xe đồ chơi Disney 181083||1||245,000||172,000|
|DCN-1927||Xe ĐK 20166||1||320,000||160,000|
|DCN-087||Thảm nhạc nông trại||1||170,000||102,000|
|DCN-1103||Đồ chơi nhà tắm Haba - Thác nước||2||790,000||474,000|
|GOI-240||Gối chặn Naforye trái dâu,cam,táo N99523,N99524,N99525||4||229,000||138,000|
|GOI-239||Gối giữ đầu cho bé màu hồng SM77395||1||299,000||180,000|
|BTCD-065||Bộ đồ ăn trăng trí 4/405||1||310,000||186,000|
|BS-014||Bình sữa bebe nhựa 120ml||3||131,000||79,000|
|TB-390||Khỉ ôm tim KO0016||1||250,000||150,000|
|BS-075||Bình sữa khử trùng Lovi 250ml||1||195,000||117,000|
|CSK-1206||Giá úp+tiệt trùng bình sữa có nắp RC53211||1||349,000||262,000|
|CSK-804||Miếng dán đuổi muỗi simba P9982 (16 miếng)||1||90,000||63,000|
|CSK-170||Miếng dán chống muỗi farlin BCK.001||2||115,000||80,500|
|BS-084||Bình sữa Music 60ml||1||39,000||23,000|
|CHAN-210||Bộ ga trẻ em Cartoon 120||1||428,000||214,000|
|TB-341||Thú bông huggies||4||55,000||22,000|
|CHAN-209||Bộ ga gối Thái 160||2||525,000||263,000|
|CSK-144||Bộ thìa nạo trái cây và ăn sinh tố BF.237||1||78,000||47,000|
|DIU-041||Địu Tâm An||1||150,000||90,000|
|DIU-032||Địu Chico Baby 0707940187(be)||1||1,190,000||714,000|
|GOI-062||Gối ôm Tâm an to||1||80,000||48,000|
|TP-1372||Sữa bột Dumex Gold rau quả số 3 400g||1||250,000||175,000|
|TP-1376||Sữa bột Dumex Gold số 2 800g||5||395,000||277,000|
|CSK-076||Giá úp bình sữa The first year||1||435,000||335,000|
|HN-080||Chậu tắm Farlin có lưới đỡ, móc sắt BF-178.0||1||625,000||525,000|
|HN-267||Ghế gội đầu cho bé 2 trong 1 HC-03||1||595,000||495,000|
|MTT-014||Tiệt trùng bằng lò vi sóng BF.213B||1||438,000||338,000|
|XTD-067||Xe tập đi Brevi-Skylab BRE553||1||2,299,000||2,284,000|
|DCN-1068||Bộ đồ chơi Super Pinball||3||250,000||100,000|
|TU-113||Bộ bàn ghế học sinh Hòa Phát BHS20-1||1||850,000||680,000|
|TU-117||Bộ bàn ghế học sinh Xuân Hòa BHS14-06 PU||4||890,000||712,000|
|XD-234||Xe đẩy Style trek-Blue-Evenflo||1||4,950,000||3,960,000|
|DCG-226||Bộ sinh vật biển dán tủ lạnh||5||30,000||24,000|
|DCN-1617||sách học đếm 004360||1||440,000||352,000|
|NT-168||Ty ngậm nano Mummy bear số 2||3||110,000||88,000|
|BTCD-148||Thìa ăn Basilic D135||1||76,000||60,800|
|MHS-011||Máy hút sữa Cimilre P1||1||1,960,000||1,760,000|
|BTCD-183||Bộ dĩa muỗng ăn BAMBOO KUKU 3024||2||78,000||59,000|
|DCG-1661||Sách nhạc thomas & Friend 39850||7||157,000||118,000|
|DCN-3088||Đồ chơi FP Kid R3322||1||349,000||262,000|
|DCN-3092||Đồ chơi Belbebe disney baby||1||499,000||374,000|
|DCSK-18760||Bộ 3 con thú Tiger, Pooh, Eyeore||2||360,000||270,000|
|DCN-1125||Đồ chơi Tomi 71502 Puddle Bear||1||360,000||252,000|
|DCN-1134||Đồ chơi Tomi 71874 Pooh Buddy Buggy Pooh||1||490,000||343,000|
|DCN-2319||Tháp xếp thông minh FM01||1||150,000||105,000|
|DCN-3402||Đồ chơi xe đẩy hình voi||1||50,000||35,000|
|NT-210||Núm ty Kuku cổ rộng M KU5276||2||79,000||55,000|
|TB-295||Thảm chơi Babys Friends No.3199||0||975,000||585,000|
|DCN-1626||vali kéo đa năng hình gấu con 003763||1||1,100,000||550,000|
|DCN-1763||Hải cẩu cót||1||15,000||8,000|
|DCN-589367||Máy bay điều khiển từ xa||1||525,000||263,000|
|GA-069||Ghế ăn BBH 290D||1||1,690,000||845,000|
|QAK-270||Quần ss Lullaby 12M(trắng)||10||33,000||17,000|
|QAH-1301||Bộ ba lỗ hình mông thú Busha||3||115,000||58,000|
|QAM-089||Áo ss miomio 1M(cộc,hình)||3||38,000||19,000|
|QAM-051||Quần miomio 3M(cộc,hồng)||9||26,000||13,000|
|MP-303||Tinh dầu dưỡng da cho bé Sanosan 200ml||1||131,000||Tặng cho đơn hàng sơ sinh > 2.000.000 VNĐ|
|MP-023||Dầu chống rạn bụng đặc biệt Buchen||3||180,000||Tặng đơn h��ng sơ sinh trên 1,000,000 VNĐ|
|GX-142||Nước xả vải Consensus 1.83L||3||204,000||Tặng đơn hàng sơ sinh trên 2,000,000 VNĐ|
|GX-143||Nước xả vải Consensus 2.1L||1||219,000||Tặng đơn hàng sơ sinh trên 2,000,000 VNĐ|
|mp-494||ngâm móng vitamin tổng hợp-MK||2||299,000||Tặng đơn hàng sơ sinh trên 2,000,000 VNĐ|
|MP-230||Sữa tắm chứa sữa johnson 100ml||4||32,000||Tặng đơn hàng sơ sinh trên 500,000 VNĐ|
|GX-005||Nước xả Dnee 650ml (túi)||4||47,000||Tặng đơn hàng sơ sinh trên 500,000 VNĐ|
|SD-930||Trò chơi xếp hình - M1||68||30,000||Tặng đơn hàng sơ sinh trên 500,000 VNĐ|
|DCN-711||Giá chữ A phát nhạc thông minh C1454||1||2,546,000||1,528,000|
|DCN-4150||Đồ chơi treo nôi cũi canpol 2/171||1||630,000||378,000|
|XD-103||Ô tô điện KB-5018 2 động cơ||1||3,100,000||500,000|
|XD-279||Ô tô điện HJ 8888 bánh nhựa||1||3,100,000||500,000|
|Tp-998||Sữa Hero Baby Hà Lan 800g số 1||5||480,000||280,000|
Mã SẢN PHẨM TÊN SẢN PHẨM SỐ LƯỢNG GIÁ BÁN GIÁ THANH LÝ
|DIU-046||Địu TL Supeguaro||1||242,000||121,000|
|DCN-1721||Đàn 168-19||1||115,000||58,000|
|TB-106||Ba lô 1205||1||185,000||74,000|
|DCM-099||Thấm sữa nuk 252004||1||121,000||85,000|
|DGD-004||Máy Massage LC2007 AA||1||290,000||145,000|
|CSK-016||Bộ chế biến đồ ăn lớn (combi) 111673||1||645,000||452,000|
|HN-003||Tấm trải chậu tắm Fralin BF.178.3||2||147,000||59,000|
|DCN-066||Kèn hình chai sữa 3325||1||115,000||58,000|
|ML-017||Tấm trải cho bé BF.431||1||85,000||43,000|
|CHAN-329||Chăn nỉ Lhom-KT057||1||185,000||93,000|
|TB-021||Sâu hạt L2||1||60,000||36,000|
|TB-056||Thú bông treo L2||1||45,000||27,000|
|GDTE-028||Giày Thái doremon 100885||1||165,000||66,000|
|SD-738||Sách vải Disney kiêm gối (nhỏ)||4||180,000||90,000|
|TB-249||Gối đỡ cổ cute đẹp||1||120,000||48,000|
|BTCD-065||Bộ đồ ăn trăng trí 4/405||1||310,000||124,000|
|BTCD-063||Bộ đồ ăn bằng nhựa 4/401||1||204,000||82,000|
|CSK-1270||Bắt đựng thức ăn có nắp 255192||1||336,000||134,000|
|MP-243||Kem trị hăm Bubchen (tuýp) 4920||1||126,000||101,000|
|CSK-1269||Hộp đựng thức ăn Nuk 255193||1||283,000||142,000|
|BTCD-045||Bộ ăn dặm hình gấu 2/422||1||115,000||58,000|
|CRHM-200||Gặm nướu silicon BF46843||2||149,000||89,000|
|BS-662||Bình sữa chicco 57253 sao xanh 240ml||1||360,000||216,000|
|DCM-020||Áo lót đen B80 26/656||1||485,000||Tặng khách mua đơn sơ sinh >=1,000,000|
|BTG-414||Bỉm cho mẹ cary||45||8,000||tặng đơn sơ sinh >= 500,000|
|BTG-221||Bỉm Goon Slim XL30||1||180,000||162,000|
|HN-300||
|
Mã SẢN PHẨM TÊN SẢN PHẨM SỐ LƯỢNG GIÁ BÁN GIÁ THANH LÝ
|KS-385||Khăn tăm Pooh 102644||3||74,000||37,000|
|HN-300||Chậu tắm 2 tầng Thái 267/PK||1||255,000||153,000|
|HN-298||Chậu tắm chống trượt Thái 266/PL||3||235,000||141,000|
|NT-422||Ty ngậm Chicco, silicon 12M+, xanh 17760||1||97,500||68,000|
|NT-255||Ty ngậm cao su Chicco Physio màu xanh 12m+||1||97,500||68,000|
|CHAN-027||Chăn hè Catasy C2009||1||195,000||98,000|
|NT-076|
Mã SẢN PHẨM TÊN SẢN PHẨM SỐ LƯỢNG GIÁ BÁN GIÁ THANH LÝ
|MTT-001||Bình sữa Yoomi 140ml||1||290,000||174,000|
|HS-013||Máy hâm sữa DrBrown||1||1,458,000||874,800|
|MTT-079||Bộ tiệt trùng trong lò vi sóng||1||695,000||347,500|
|NT-596||Bộ 2 ty giả Lovi (3-6M+)||2||199,000||99,500|
|CRHM-075||Cắn răng combi bước 3||2||205,000||143,500|
|CRHM-073||Cắn răng combi bước 1 81001||3||190,000||133,000|
|CRHM-200||Gặm nướu silicon BF46843||2||149,000||74,500|
|BS-156||Bình sữa Yoomi 140ml||1||305,000||183,000|
|CRHM-199||Gặm nướu chải lợi BF46853||1||149,000||74,500|
|MHS-332|
Mã SẢN PHẨM TÊN SẢN PHẨM SỐ LƯỢNG GIÁ BÁN GIÁ THANH LÝ
|DCN-590217||Xe cẩn cẩu điều khiển từ xa có sạc, pin HWA980406||1||369,000||185,000|
|TP-1632||HT-Sữa Dielac Sure Prevent (400g)||1||205,000||164,000|
|DCN-2158||Laptop thông minh nhận biết đa năng FM01774||1||190,000||57,000|
|DCN-2212||Trống lăn tập bò||1||120,000||36,000|
|DCSK-45798||Bộ đồ chơi tàu hỏa Pull Back Thomas 45798||1||160,000||80,000|
|DCN-3385||Đồ chơi Xe đẩy vịt||1||49,000||25,000|
|DCN-042||Đồ chơi lamaze (loại to)||6||125,000||38,000|
|DCN-886||Đồ chơi Disco Robo VN kèm loa (đỏ, hồng)||1||830,000||498,000|
|TB-293||Thảm chơi Babys Friends No.3211,3059||1||540,000||162,000|
|DCN-240||Bộ đồ chơi bàn bia 930||1||145,000||73,000|
|DCN-3082||Đồ chơi FP lục lạc sư tử||1||249,000||125,000|
|CSK-017||HN-Hộp chia sữa tròn Upass(UP8005C)||1||47,000||24,000|
|GOI-129||Gối chặn an toàn SM91020A||1||499,000||200,000|
|HN-265||Chậu tắm du lịch Summer 08310||2||749,000||225,000|
|GOI-156||Gối cổ du lịch summer 77330||1||239000||72,000|
|TP-998||Sữa Friso 800g số 1||7||480,000||288,000|
|TP-007||Sữa Friso 800g số 3||3||480,000||288,000|
|TP-1185||Sữa Similac Gain Total Comfort 820g số 2||1||590,000||570,000|
|TP-123||Sữa Aptamil Anh 900g Số 1||2||490,000||460,000|
|TP-133||Sữa Nan Nga 400g số 3||1||269,000||209,000|
|TP-184||Sữa Nan Nga 800g số 2||1||489,000||429,000|
|TP-1443||Cốm bổ dưỡng Faskid||1||129,000||79,000|
|NT-081||Núm ty Drbown (rộng) S2||6||85,000||43,000|
|BS-256||Núm ty chống đầy hơi Step up 0M+ dòng chảy trung bình 60073||2||159,000||80,000|
|BS-255||Núm ty chống đầy hơi Step up 0M+ dòng chảy chậm||1||159,000||80,000|
|NT-565||Núm ty nano mummybear size +(hẹp)||1||49,000||25,000|
|NT-003||Núm ty nuk số 1 (hẹp,si,L)đơn 709121||5||63,000||32,000|
|NT-028||Núm ty nuk số 1 (rộng, si, L)-đôi 709201||4||60,000||30,000|
|NT-297||Núm ty nuk số 1 (si,sizeM,cổ hẹp) - đôi 709090||2||51,000||26,000|
|NT-098||Núm ty pigeon (cổ hẹp, silicoe, size S)||2||69,000||35,000|
|NT-185||Núm ty pigeon (cổ hẹp, silicone, size M)||1||69,000||35,000|
|NT-426||Núm ty pigeon plus size S (cổ rộng)||1||65,000||33,000|
|NT-618||Núm ty Avent(tự nhiên) 6M+ SCF656.27||2||80,000||40,000|
|NT-298||Núm ty nuk số 2 (si,sizeM,cổ hẹp) - đôi 721095||1||51,000||26,000|
|NT-036||Núm ty nuk số 1 (hẹp, si, M) đơn 709120||1||63,000||32,000|
|NT-076||Núm ty DrBrown (rộng) số 1||1||85,000||43,000|
|NT-083||Núm ty DrBrown (hẹp) Y-cut||1||70,000||35,000|
|NT-054||Núm ty Nano mummy bear (rộng) 3 lỗ||1||52,000||26,000|
|NT-113||Núm ty avent số 1 (rộng)||1||60,000||30,000|
|NT-030||Núm ty nuk số 1 (rộng, si,M) 709200||2||60,000||30,000|
|NT-116||Núm ty avent số 4 (rộng) SCF634.27||1||60,000||30,000|
|TP-1907||Tinh dầu dừa nguyên chất Skinny Coconut Oil 500ml||1||590,000||295,000|
|XD-324||Xe đẩy Zaracos Larry 3186 (đẩy 2 chiều tiện lợi)||2||2,785,000||1,393,000|
|XD-090||Xe đẩy seebaby T04||1||1,320,000||660,000|
|XD-133||Xe đẩy Seebaby QQ3||1||750,000||450,000|
|XD-320||Xe đẩy đôi 123||1||1,950,000||975,000|
|XTD-058||Xe tập đi 2 trong 1 KU6025||1||1,744,000||1,046,000|
|XTD-059||Xe tập đi gỗ Tiền phong||3||280,000||180,000|
|XD-134||Xe đẩy Seebaby T11a màu tím||1||1,220,000||610,000|
|CUI-098||Chặn cửa an toàn(tự nhiên)||2||630,000||315,000|
|XTD-044||Xe tập đi gỗ Sport ( Nhật Minh) mới||1||320,000||220,000|
|XTD-024||HN-Xe tập đi con gà Nhật Minh||2||260,000||160,000|
|NOI-013||Nôi 3 sao||2||1,440,000||720,000|
|NOI-011||Nôi 1 sao||1||970,000||485,000|
|MHS-105||Hút sữa tay AmaryLL 190||1||1,350,000||945,000|
Mã SẢN PHẨM TÊN SẢN PHẨM SỐ LƯỢNG GIÁ BÁN GIÁ THANH LÝ
|DCG-1053||Đồ chơi gỗ bánh lăn ziczac||1||248,000||148,800|
|HN-102||Chậu tắm Combi 19975||1||989,000||692,300|
|HN-095||Thau tắm Farlin có lưới đỡ, kẹp nhựa BF-178A||1||795,000||556,500|
|DCN-199||Chó đàn tập đi (chạy pin)||1||199,000||99,500|
|MHS-330||Máy hút sữa điện đôi Professional care 2206M2||3||1,980,000||1,584,000|
|DCN-617||Bàn bắn bóng tập đứng Fisher Price W9859||1||1,350,000||810,000|
|DCN-2585||Đồ chơi xoay và uốn chú sâu S4011038||2||159,000||95,400|
|HN-258||Bô trẻ em kuku 1051||2||665,000||399,000|
|DCN-49017||Thỏ pin phát nhạc 333-30||1||75,000||37,500|
|DCN-1952||Hộp khối đồ chơi bông mềm bằng voi 68/027||1||310,000||186,000|
|DCN-042||Đồ chơi bông Lamaze (Lamaze Kerry the Fairy Play and Grow Toy)||3||125,000||75,000|
|BCT-085||Giày tập đi đế da||1||90,000||54,000|
|CSK-1050||Yếm ăn Munchkin 34081||1||219,000||153,300|
|DCN-49076||Đèn ngủ di động 11569||1||489,000||342,300|
|DCN-589395||Đồ chơi nhà đa năng cho bé No.739||1||385,000||192,500|
|CSK-647||Máy báo khóc Brevi Monitor Plus BRE340||1||2,900,000||1,740,000|
|CRHM-581||Máy xông hút mũi Co-Clean Original||1||1,430,000||858,000|
|DIU-125||Địu Combi La Qpit 4 cách||1||4,290,000||3,003,000|
|DCN-589388||Bàn nhạc Playskool JB07||1||735,000||441,000|
|DCN-49077||Bộ đồ chơi Munchkin 15300 nàng tiên cá||1||329,000||197,400|
|DCN-1737||Đồ chơi đo nhiệu độ nước tắm vịt mẹ và con 78671||1||160,000||96,000|
|GDTE-141||Giầy Atiipas Together cho bé nhiều màu||1||399,000||239,400|
|DCN-1365||Vịt báo nóng kiểu mới MK10065||2||149,000||89,400|
|DCN-2611||Đồ chơi ống nhòm 3D kỳ diệu Fisher Price 74332||1||259,000||155,400|
|CRHM-579||Bộ quà tặng Nasopure||1||890,000||445,000|
|DCN-589757||Bể cá sắc màu Toyroyal 7196||1||139,000||97,300|
|DCN-66122||Lục lạc mèo 66122 - Winwwin Toys||1||54,000||27,000|
|DCN-895||Tàu 8314||1||285,000||142,500|
|MP-470||Xịt thơm Emofresh (thơm miệng,trị hôi miệng,khô miệng 15ml)||1||20,000||10,000|
|DCN-2586||Đồ chơi ốc sên biết bò và biết xoay bụng S4011066||1||199,000||119,400|
|DCN-598||Sao biển phun nước 11304||2||299,000||209,300|
|CRHM-069||Xúc xắc có miếng cắn răng hình cún con Canpol 2/662||1||125,000||87,500|
|BS-235||Bình sữa Chicco Step Up 2M+ điều chỉnh dòng chảy||1||299,000||209,300|
|DCN-1138||Đồ chơi bồn tắm Munchkin 10320 hình vịt bé gái||1||229,000||137,400|
|DCN-1356||Đồ chơi treo nôi – Nhà chim cúc cu Parkfield 67907P||1||120,000||84,000|
|DCN-1619||Cây hoa xúc xắc Bkids||1||320,000||224,000|
|BS-258||Núm ty chống đầy hơi Step up 4M+ dòng chảy nhanh 600742||3||105,000||52,500|
|BS-256||Núm ty chống đầy hơi Step up 0M+ dòng chảy trung bình 60073||4||105,000||52,500|
|BS-255||Bình sữa diệt khuẩn Nano sillicon cao cấp||2||232,000||162,400|
|NT-247||Núm ty chống đầy hơi 2M+ 600741||1||105,000||52,500|
|NT-281||Núm ty Chicco, silicon 4M+ 81629||1||77,500||38,750|
|NT-253||Ty ngậm cao su Physio Chicco màu hồng 4M+||1||97,500||48,750|
|NT-284||Ty ngậm chicco, su 12M+ 17690||2||97,500||48,750|
|NT-422||Ty ngậm chicco, silicon 12M+, xanh 17760||1||97,500||48,750|
|NT-258||Ty ngậm sil physio chicco 4M+ 17720||2||97,500||48,750|
|DCN-1612||đàn guitar ếch con thích hát 004159||1||440,000||220,000|
|DCN-1624||dàn hợp xướng ếch con 078598||1||250,000||175,000|
|DCN-3220||HCM- Đàn thú số 6037B||1||110,000||77,000|
|DCN-1203||Máy tính bảng học chữ mô phỏng Ipad 004361||1||490,000||343,000|
|DCN-1615||công viên nước kỳ diệu 004303||1||380,000||266,000|
|DCN-1619||Cây hoa xúc xắc Bkids||1||320,000||224,000|
|DCN-1902||Màu sáp dễ rửa 31286||1||169,000||84,500|
|CSK-600||Bộ 4 thìa chuyển màu Nuby||1||148,000||74,000|
|BS-037||Bình sữa nhựa PP trong 100ml||1||195,000||97,500|
|CSK-1235||Bộ chế biến kèm bát lọc Combi 114222||3||349,000||244,300|
|DCN-1349||Xe kéo – Bọ rùa chở bóng (66331P)||1||279,000||195,300|
|DCN-1567||71707 Bánh xe lăn phát nhạc||2||895,000||447,500|
|BS-136||Bình sữa Pigeon Việt Nam 120ml (cổ thường)||4||80,000||56,000|
|BS-237||Bình sữa Chicco Step Up 6M+ dành cho ăn đặc 330ml||1||310,000||155,000|
|CSK-5369||Bình rửa mũi Pari Montesol 3296||3||295,000||177,000|
|NK-081||Nhiệt kế Hannox LCT 300||1||515,000||257,500|
|DCN-1737||Đồ chơi đo nhiệu độ nước tắm vịt mẹ và con 78671||1||160,000||80,000|
|DIU-007||Địu 2015||5||195,000||97,500|
|DCN-589369||Đồ chơi xếp vòng có nhạc Lamaze LC27309||1||545,000||327,000|
|DCN-49088||Gấu bông ru ngủ SM02370||2||699,000||349,500|
|BD-036||Body cộc QC 17||1||120,000||60,000|
|qak-111||Quần ss lullaby 12M(màu,dày)||2||38,000||19,000|
|QAK-883||Bộ lá GirlyOne Hello BB S3,S4||8||114,000||57,000|
|QAK-874||Bộ ngắn babyone hello BB||13||195,000||97,500|
|TB-259||Thảm chơi Q3248C||1||850,000||425,000|
|TB-261||Thảm chơi Q-3221CL||1||850,000||425,000|
|DCN-589231||Hộp lục lạc bàn chân 10 Mon 7824||1||128,000||64,000|
|TP-1902||Sữa Biomilk 400g số 3||2||258,000||129,000|
|CCR-015||Cây cọ rửa bình sữa nuk 256279||1||208,000||104,000|
|MHS-080||Máy hút sữa bằng tay Chicco||1||670,000||402,000|
|MP-352||Tinh dầu tràm Kim Vui xứ Huế 125ml||1||120,000||72,000|
|NK-075||Máy xông mũi họng Microlife NEB50A||3||1,100,000||660,000|
|GOI-129||Gối chặn an toàn SM91020A||2||499,000||299,400|
|TU-128||Kệ đựng đồ cho bé Munchkin 43449||1||1,149,000||689,400|
|DCN-42435||Bộ thẻ xốp Munchkin 42435 gồm 24 chiếc||2||219,000||131,400|
|DCN-49078||Bộ đồ chơi xốp Munchkin 15303 phương tiện hàng hải||2||359,000||215,400|
|DCN-1250||Đồ chơi câu cá Munchkin 11081 Gone fishin bath toy||1||299,000||179,400|
|DGD-120||Khuôn làm kem cho bé Munchkin 6pk CL Fresh Food Freezer Pops||3||269,000||161,400|
|DCN-49081||Bộ tiệc trà trong nhà tắm Munchkin 24020||4||399,000||239,400|
|DCN-49079||Bộ đồ chơi xốp Munchkin 15304 nàng tiên cá||1||359,000||215,400|
|DCN-599||Bộ 3 rùa nối đuôi 24025||3||299,000||179,400|
|DCN-3150||Đồ chơi hoàng tử ếch Munchkin 24024||2||259,000||155,400|
|CSK-1021||Đồ chơi phun bong bóng Summer 08284 - Tub Time Bubble Maker||1||349,000||209,400|
|DCN-2313||Đồ chơi Munchkin 26969 phao tắm và sinh vật biển||2||279,000||167,400|
|DCN-600||Bộ đồ chơi bóng rổ Munchkin 18003||1||319,000||191,400|
|DCN-3137||Đồ chơi bồn tắm Munchkin 10262 hình vịt bé trai||1||229,000||137,400|
|DCN-1138||Đồ chơi bồn tắm Munchkin 10320 hình vịt bé gái||1||229,000||137,400|
|DCN-3149||Đồ chơi Munchkin 11565 thác nước hình con vật||1||259,000||155,400|
|DCN-602||Đồ chơi bóng xúc xắc Munchkin 23209||1||159,000||95,400|
|DCN-1996||Đồ chơi xếp chồng con sên Munchkin 18000||1||349,000||209,400|
|QATD-1191||Áo nỉ Mango cho bé gái||1||97,000||58,200|
|QAK-884||Bộ lá GirlyOne Hello BB S5||4||134,000||67,000|
|QATD-684||Áo khoác cho em bé Carter's 0110||1||165,000||82,500|
|GX-150||HCM - Nước giặt with mom 1.8l||3||218,500||131,100|
|QAN-1210||Áo nỉ bông trần Carters S36||1||63,000||31,500|
|ML-013||Tấm lót chống thấm cho trẻ sơ sinh||1||7,000||3,500|
|XD-167||Xe đẩy trẻ em siêu nhẹ Ibeis A05 (nhiều mầu)||1||780,000||390,000|
|DCN-49056||Đồ chơi làm kem thật Little Tikes 1178||1||2,100,000||1,050,000|
|ML-037||Thảm xốp 2 mặt Dolphin cho em bé (150 x 180 cm)||1||200,000||100,000|
|DCG-1060||Đồ chơi gỗ hình cá sấu||1||216,000||108,000|
|CUI-139||Giường cũi trẻ em Cambrige||2||3,350,000||2,345,000|
|XD-358||Mũ bảo hiểm xe đạp Fornix||6||350,000||245,000|
|XTD-112||Xe tập đi 2 trong 1 500798||1||1,850,000||925,000|
|XD-282||Xe đẩy em bé đa năng Brevi Ginger BRE753||1||6,100,000||3,660,000|
|XD-321||Xe đẩy Chicco Liteway||1||4,600,000||2,760,000|
|HS-077||Máy hâm nóng bình sữa tự ngắt điện Lovi||1||809,000||485,400|
|XD-292||Xe đẩy Zaracos Royal 1286||1||3,485,000||1,742,500|
|XD-247||Xe đẩy em bé 2 chiều KuKu KU6028||1||4,653,000||2,791,800|
|XD-239||Xe đẩy siêu nhẹ kuku 6032||2||3,390,000||2,034,000|
|XTD-619||Xe chòi chân Mini - Little Tikes 478300070||1||2,522,000||1,261,000|*Để biết thêm thông tin chi tiết vui lòng liên hệ: * *www.ShopTreTho.com.vn* * – Hotline: 1900 6483*

Set-Cookie: _CookiesCustomerId=PC73C3A6D9DCAF4,1; expires=Tue, 24-Apr-2018 11:42:47 GMT; path=/


text:
cần nam ở ghép (ưu tiên đã đi làm)
Ngày cập nhật: 12/02/2014
Mã tin: 112481
Lượt xem: 334
Tin đăng đã hết hạn.
Giá thuê:
600,000 vnđ
Diện tích:
24 m²
Địa chỉ:
đường số 1, phường hiệp bình chánh, q. thủ đức
Thông tin mô tả
phòng sạch sẽ, thoáng mát, có wifi, rất an ninh, yên tĩnh. phòng 1.8 tr (hiện có 2 người ở - đã đi làm). hiện mình cần từ 1-2 bạn nam ở ghép (ưu tiên đã đi làm).
Xem phòng từ 18h tối các ngày trong tuần.
có j các bạn liên hệ qua số này nhé 0978794254(khâm) or 0987046234(cường)
Tin đăng cùng khu vực
-
Cần gấp 2 bạn nữ ở ghép đường số 34, Q. Thủ ĐứcĐịa chỉ: 39 Đường số 34 P. Linh Đông, Quận Thủ Đức, TP.HCM1,300,000Thủ Đức 30/10/2015
-
TÌM NGƯỜI Ở GHÉP-ĐƯỜNG 27- HIỆP BÌNH CHÁNH- THỦ ĐỨC ( gần Cá Sấu Hoa Cà, Ngã tư Bình Triệu)Địa chỉ: ĐƯỜNG 27- HIỆP BÌNH CHÁNH- THỦ ĐỨC (Đường Phạm Văn Đồng- gần Cá Sấu Hoa Cà, Ngã tư Bình Triệu)Thỏa thuậnThủ Đức 04/01/2015
-
Cần nữ ở ghépĐịa chỉ: kha vạn cân900,000Thủ Đức 11/02/2014
-
Cần Tìm Bạn ở Gép Ở Thủ ĐứcĐịa chỉ: 163/5/1 đặng văn bi .Phường Trườn Thọ Q. Thủ ĐứcThỏa thuậnThủ Đức 11/02/2014
-
CẦN 3 SINH VIÊN Ở GHÉP CHUNG CƯ AN BÌNH - THỦ ĐỨCĐịa chỉ: THỦ ĐỨC - TP HÒ CHÍ MINH600,000Thủ Đức 11/02/2014
-
Ở ghép giá rẻ, an toàn 250k ở Thủ Đức, HCMĐịa chỉ: 12/2 đường số 5, Linh Chiểu, Thủ Đức250Thủ Đức 11/02/2014
-
Cần nữ ở ghép - đường Đặng Văn Bi, phường Bình ThọĐịa chỉ: 24/4 Đặng Văn Bi, phường Bình Thọ, quận Thủ Đức1,500,000Thủ Đức 09/02/2014
-
Cần tìm 2 nam sinh viên ở ghép nhà nguyên căn tại Cá Sáu Hoa càĐịa chỉ: 3/18 Đường 49 Thủ Đức TPHCM3,000,000Thủ Đức 06/02/2014
-
Cần 2 nữ ở ghépĐịa chỉ: 28/9/2 đường số 15,khu phố 1, p hiệp Bình Chánh, Thủ đức ( gần nhà thờ Patima- cầu bình triệu))450,000Thủ Đức 06/02/2014
-
cần 2 nữ ở ghép gần đại học Nông LâmĐịa chỉ: đường 16, kp.1, p. Linh Trung, Quận Thủ Đức, Tp. HCM1,500,000Thủ Đức 06/02/2014
Tìm người ở ghép tại Thủ Đức
-
Tìm người ở ghép tại Quận 1
-
Tìm người ở ghép tại Quận 2
-
Tìm người ở ghép tại Quận 3
-
Tìm người ở ghép tại Quận 4
-
Tìm người ở ghép tại Quận 5
-
Tìm người ở ghép tại Quận 6
-
Tìm người ở ghép tại Quận 7
-
Tìm người ở ghép tại Quận 8
-
Tìm người ở ghép tại Quận 9
-
Tìm người ở ghép tại Quận 10
-
Tìm người ở ghép tại Quận 11
-
Tìm người ở ghép tại Quận 12
-
Tìm người ở ghép tại Tân Bình
-
Tìm người ở ghép tại Thủ Đức
-
Tìm người ở ghép tại Gò Vấp
-
Tìm người ở ghép tại Bình Tân
-
Tìm người ở ghép tại Bình Thạnh
-
Tìm người ở ghép tại Tân Phú
-
Tìm người ở ghép tại Phú Nhuận
-
Tìm người ở ghép tại Bình Chánh
-
Tìm người ở ghép tại Nhà Bè
-
Tìm người ở ghép tại Hóc Môn
-
Tìm người ở ghép tại Cần Giờ
-
Tìm người ở ghép tại Củ Chi

markdown:
![ ](https://thuephongtro.com/Style/images/banner.gif)
# cần nam ở ghép (ưu tiên đã đi làm)
Ngày cập nhật: 12/02/2014
Mã tin: 112481
Lượt xem: 334
Tin đăng đã hết hạn.
Giá thuê:
600,000 vnđ
Diện tích:
24 m²
Địa chỉ:
đường số 1, phường hiệp bình chánh, q. thủ đức
Thông tin mô tả
phòng sạch sẽ, thoáng mát, có wifi, rất an ninh, yên tĩnh. phòng 1.8 tr (hiện có 2 người ở - đã đi làm). hiện mình cần từ 1-2 bạn nam ở ghép (ưu tiên đã đi làm).
Xem phòng từ 18h tối các ngày trong tuần.
có j các bạn liên hệ qua số này nhé 0978794254(khâm) or 0987046234(cường)
## Tin đăng cùng khu vực
-
[Cần gấp 2 bạn nữ ở ghép đường số 34, Q. Thủ Đức](/phong-tro/105557/can-gap-2-ban-nu-o-ghep-duong-so-34-q-thu-duc.html)Địa chỉ: 39 Đường số 34 P. Linh Đông, Quận Thủ Đức, TP.HCM1,300,000 **Thủ Đức**30/10/2015
-
[TÌM NGƯỜI Ở GHÉP-ĐƯỜNG 27- HIỆP BÌNH CHÁNH- THỦ ĐỨC ( gần Cá Sấu Hoa Cà, Ngã tư Bình Triệu)](/phong-tro/53170/tim-nguoi-o-ghep-duong-27-hiep-binh-chanh-thu-duc--gan-ca-sau-hoa-ca-nga-tu-binh-trieu.html)Địa chỉ: ĐƯỜNG 27- HIỆP BÌNH CHÁNH- THỦ ĐỨC (Đường Phạm Văn Đồng- gần Cá Sấu Hoa Cà, Ngã tư Bình Triệu)Thỏa thuận **Thủ Đức**04/01/2015
-
[Cần nữ ở ghép](/phong-tro/112439/can-nu-o-ghep.html)Địa chỉ: kha vạn cân900,000 **Thủ Đức**11/02/2014
-
[Cần Tìm Bạn ở Gép Ở Thủ Đức](/phong-tro/112435/can-tim-ban-o-gep-o-thu-duc.html)Địa chỉ: 163/5/1 đặng văn bi .Phường Trườn Thọ Q. Thủ ĐứcThỏa thuận **Thủ Đức**11/02/2014
-
[CẦN 3 SINH VIÊN Ở GHÉP CHUNG CƯ AN BÌNH - THỦ ĐỨC](/phong-tro/112404/can-3-sinh-vien-o-ghep-chung-cu-an-binh--thu-duc.html)Địa chỉ: THỦ ĐỨC - TP HÒ CHÍ MINH600,000 **Thủ Đức**11/02/2014
-
[Ở ghép giá rẻ, an toàn 250k ở Thủ Đức, HCM](/phong-tro/112402/o-ghep-gia-re-an-toan-250k-o-thu-duc-hcm.html)Địa chỉ: 12/2 đường số 5, Linh Chiểu, Thủ Đức250 **Thủ Đức**11/02/2014
-
[Cần nữ ở ghép - đường Đặng Văn Bi, phường Bình Thọ](/phong-tro/112168/can-nu-o-ghep--duong-dang-van-bi-phuong-binh-tho.html)Địa chỉ: 24/4 Đặng Văn Bi, phường Bình Thọ, quận Thủ Đức1,500,000 **Thủ Đức**09/02/2014
-
[Cần tìm 2 nam sinh viên ở ghép nhà nguyên căn tại Cá Sáu Hoa cà](/phong-tro/111899/can-tim-2-nam-sinh-vien-o-ghep-nha-nguyen-can-tai-ca-sau-hoa-ca.html)Địa chỉ: 3/18 Đường 49 Thủ Đức TPHCM3,000,000 **Thủ Đức**06/02/2014
-
[Cần 2 nữ ở ghép](/phong-tro/111893/can-2-nu-o-ghep.html)Địa chỉ: 28/9/2 đường số 15,khu phố 1, p hiệp Bình Chánh, Thủ đức ( gần nhà thờ Patima- cầu bình triệu))450,000 **Thủ Đức**06/02/2014
-
[cần 2 nữ ở ghép gần đại học Nông Lâm](/phong-tro/111889/can-2-nu-o-ghep-gan-dai-hoc-nong-lam.html)Địa chỉ: đường 16, kp.1, p. Linh Trung, Quận Thủ Đức, Tp. HCM1,500,000 **Thủ Đức**06/02/2014 ![](/uploads/images/ads/viphqc.gif)
![](/uploads/images/ads/viphqc.gif)
## Tìm người ở ghép tại Thủ Đức
-
[Tìm người ở ghép tại Quận 1](/tim-nguoi-o-ghep/1c/quan-1.html)
-
[Tìm người ở ghép tại Quận 2](/tim-nguoi-o-ghep/2c/quan-2.html)
-
[Tìm người ở ghép tại Quận 3](/tim-nguoi-o-ghep/3c/quan-3.html)
-
[Tìm người ở ghép tại Quận 4](/tim-nguoi-o-ghep/4c/quan-4.html)
-
[Tìm người ở ghép tại Quận 5](/tim-nguoi-o-ghep/5c/quan-5.html)
-
[Tìm người ở ghép tại Quận 6](/tim-nguoi-o-ghep/6c/quan-6.html)
-
[Tìm người ở ghép tại Quận 7](/tim-nguoi-o-ghep/7c/quan-7.html)
-
[Tìm người ở ghép tại Quận 8](/tim-nguoi-o-ghep/8c/quan-8.html)
-
[Tìm người ở ghép tại Quận 9](/tim-nguoi-o-ghep/9c/quan-9.html)
-
[Tìm người ở ghép tại Quận 10](/tim-nguoi-o-ghep/10c/quan-10.html)
-
[Tìm người ở ghép tại Quận 11](/tim-nguoi-o-ghep/11c/quan-11.html)
-
[Tìm người ở ghép tại Quận 12](/tim-nguoi-o-ghep/12c/quan-12.html)
-
[Tìm người ở ghép tại Tân Bình](/tim-nguoi-o-ghep/13c/tan-binh.html)
-
[Tìm người ở ghép tại Thủ Đức](/tim-nguoi-o-ghep/14c/thu-duc.html)
-
[Tìm người ở ghép tại Gò Vấp](/tim-nguoi-o-ghep/15c/go-vap.html)
-
[Tìm người ở ghép tại Bình Tân](/tim-nguoi-o-ghep/16c/binh-tan.html)
-
[Tìm người ở ghép tại Bình Thạnh](/tim-nguoi-o-ghep/17c/binh-thanh.html)
-
[Tìm người ở ghép tại Tân Phú](/tim-nguoi-o-ghep/18c/tan-phu.html)
-
[Tìm người ở ghép tại Phú Nhuận](/tim-nguoi-o-ghep/19c/phu-nhuan.html)
-
[Tìm người ở ghép tại Bình Chánh](/tim-nguoi-o-ghep/54c/binh-chanh.html)
-
[Tìm người ở ghép tại Nhà Bè](/tim-nguoi-o-ghep/55c/nha-be.html)
-
[Tìm người ở ghép tại Hóc Môn](/tim-nguoi-o-ghep/56c/hoc-mon.html)
-
[Tìm người ở ghép tại Cần Giờ](/tim-nguoi-o-ghep/57c/can-gio.html)
-
[Tìm người ở ghép tại Củ Chi](/tim-nguoi-o-ghep/58c/cu-chi.html)

X-Powered-By-Plesk: PleskWin


text:
Tiếng Việt
English
Español
Português
Français
Italiano
Deutsch
العربية
हिन्दी
Русский
中文
日本語
עברית
Català
Bahasa Melayu
Türkçe
Български
Hrvatski
Česky
Dansk
Suomi
Română
Svenska
한국어
Norsk
ไทย
Xem thêm >>
Videochat20
Mã nguồn
nhiều
Phòng
Tìm theo khu vực
Trang chủ
Trò chuyện video Vùng Wallonie (Bỉ)
Tweet
Đối tác
Glossous
Whatschat
Mô tả
Chào mừng bạn đến
chat video Vùng Wallonie
Gặp xào folks về hành tinh. Miễn phí
chat video Vùng Wallonie
, trong đó bạn có thể làm các mục sau đây:
- Nói cho chi phí miễn phí với tất cả các loại của các cá nhân. để xác định nó phải đi "Settings".
- Nói chuyện với webcam ở chế độ "máy ảnh".
- Có thú vị khi bạn nhấp vào 'Next' để tìm một ai đó hấp dẫn.
- Có một cuộc trò chuyện nặc danh không có micro và không có webcam ở chế độ "văn bản".
- Spy những người khác chat video nặc danh nếu bạn được phép.
- Nhờ chat video Vùng Wallonie bạn có thể gặp gỡ bạn bè vui tốt từ khắp nơi trên hành tinh.
- Nếu bạn không muốn bị theo dõi thay đổi nó trong "Settings".
Để bắt đầu ra báo chí "F2" hoặc bấm vào 'bắt đầu'
Khu vực
Tất cả các quốc gia
|
Chat video Bỉ
Danh sách các thành phố trong Vùng Wallonie:
Tất cả các thành phố
Các trang:
1
|
2
|
3
|
Tiếp theo
Aarschot
Asse
Beauvechain
Beersel
Begijnendijk
Bekkevoort
Bertem
Bever
Bierbeek
Boortmeerbeek
Boutersem
Braine-l'Alleud
Braine-le-Château
Chastre
Chastre-Villeroux-Blanmont
Chaumont-Gistoux
Court-Saint-Étienne
Diegem
Diest
Dilbeek
Drogenbos
Galmaarden
Geetbets
Genappe
Glabbeek-Zuurbemde
Gooik
Grez-Doiceau
Grimbergen
Haacht
Halle
Herent
Herne
Hoegaarden
Hoeilaart
Holsbeek
Huldenberg
Incourt
Ittre
Jodoigne
Kampenhout
Các trang:
1
|
2
|
3
|
Tiếp theo
Sau đây cho thấy các tùy chọn để bắt đầu. Cụ thể là hai lựa chọn: tùy chọn đầu tiên của tất cả các tùy chọn cho phép bạn Gặp gỡ những người mới và các tùy chọn thứ hai cho phép bạn xem nhiều cuộc hội thoại
• Để bắt đầu, chọn một trong hai tùy chọn:
Lựa chọn 2
Lựa chọn 1
Quan sát (F3)
Bắt đầu (F2)
Đây là một cơ hội không thể bỏ lỡ. Gặp người mới từ bất cứ nơi nào trên hành tinh này có trong mọi trường hợp được như vậy đơn giản. A đang chờ đợi cho bạn? nhập trang web của chúng tôi
videochat20.com © Copyright |
Điều khoản và Điều kiện
|
Liên hệ
|
<> Phát triển bởi
mini-webs.org

Pragma: no-cache

Content-Type: text/html; Charset=utf-8


text:
Annoire
Bách khoa toàn thư mở Wikipedia
Tọa độ: 46°57′33″B 5°16′45″Đ / 46.9592°B 5.2792°Đ
Annoire là một xã của tỉnh Jura, thuộc vùng Franche-Comté, miền đông nước Pháp.
Tọa độ: 46°57′33″B 5°16′45″Đ / 46.9592°B 5.2792°Đ
Annoire là một xã của tỉnh Jura, thuộc vùng Franche-Comté, miền đông nước Pháp.

markdown:
# Annoire
Bách khoa toàn thư mở Wikipedia
[Tọa độ](/wiki/H%E1%BB%87_t%E1%BB%8Da_%C4%91%E1%BB%99_%C4%91%E1%BB%8Ba_l%C3%BD): [46°57′33″B 5°16′45″Đ / 46.9592°B 5.2792°Đ](//tools.wmflabs.org/geohack/geohack.php?language=vi&pagename=Annoire¶ms=46.9592_N_5.2792_E_region:FR-39_type:city(405))
|
|
|Hành chính|
|
| ![ Quốc kỳ Pháp](//upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/18px-Flag_of_France.svg.png)
![ Quốc kỳ Pháp](http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/18px-Flag_of_France.svg.png)
[Pháp](/wiki/Ph%C3%A1p) [Vùng](/wiki/V%C3%B9ng_c%E1%BB%A7a_Ph%C3%A1p) [Franche-Comté](/wiki/Franche-Comt%C3%A9) [Tỉnh](/wiki/T%E1%BB%89nh_c%E1%BB%A7a_Ph%C3%A1p) [Jura](/wiki/Jura) [Quận](/wiki/Qu%E1%BA%ADn_c%E1%BB%A7a_Ph%C3%A1p) [Dole](/wiki/Dole_(qu%E1%BA%ADn)) [Tổng](/wiki/T%E1%BB%95ng_c%E1%BB%A7a_Ph%C3%A1p) [Xã (thị) trưởng](/wiki/Th%E1%BB%8B_tr%C6%B0%E1%BB%9Fng)
(2008–2014)
[Độ cao](/wiki/Cao_%C4%91%E1%BB%99) 1 2(6,06 sq mi) [Nhân khẩu](/wiki/Nh%C3%A2n_kh%E1%BA%A9u_Ph%C3%A1p) 2 [Mật độ](/wiki/M%E1%BA%ADt_%C4%91%E1%BB%99_d%C3%A2n_s%E1%BB%91) 2(67 /sq mi) [INSEE](/wiki/M%C3%A3_INSEE)/Mã bưu chính [39011](http://recensement.insee.fr/searchResults.action?zoneSearchField=&codeZone=39011-COM)/ [39120](/wiki/Danh_s%C3%A1ch_c%C3%A1c_m%C3%A3_b%C6%B0u_ch%C3%ADnh_%E1%BB%9F_Ph%C3%A1p) 1Dữ liệu địa chính Pháp loại trừ các hồ và ao lớn hơn 1 km² (0.386 dặm vuông hoặc 247 [acre](/wiki/Acre)) cũng như các cửa sông. 2 *Dân số không tính hai lần*: cư dân của nhiều xã (ví dụ, các sinh viên và quân nhân) chỉ tính một lần. **Annoire** là một [xã](/wiki/X%C3%A3_c%E1%BB%A7a_t%E1%BB%89nh_Jura) của [tỉnh](/wiki/T%E1%BB%89nh_(Ph%C3%A1p)) [Jura](/wiki/Jura,_Franche-Comt%C3%A9), thuộc [vùng](/wiki/V%C3%B9ng_c%E1%BB%A7a_Ph%C3%A1p) [Franche-Comté](/wiki/Franche-Comt%C3%A9), miền đông nước [Pháp](/wiki/Ph%C3%A1p).
## Dân số[
[sửa](/w/index.php?title=Annoire&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=Annoire&action=edit§ion=1)]
|Lịch sử dân số|
|Năm||Dân số||Tỉ lệ|
|1962||456||—|
|1968||490||+7.5%|
|1975||426||−13.1%|
|1982||439||+3.1%|
|1990||401||−8.7%|
|1999||411||+2.5%|
|2008||405||−1.5%|

Set-Cookie: GeoIP=US:VA:Ashburn:39.05:-77.47:v4; Path=/; secure; Domain=.wikipedia.org

X-Content-Type-Options: nosniff

Cache-Control: private, s-maxage=0, max-age=0, must-revalidate

X-Cache-Status: miss

P3P: CP="This is not a P3P policy! See https://vi.wikipedia.org/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:CentralAutoLogin/P3P for more info."

Via: 1.1 varnish-v4, 1.1 varnish-v4

Content-Language: vi

X-UA-Compatible: IE=Edge

X-Cache: cp2007 miss, cp2019 miss

Vary: Accept-Encoding,Cookie,Authorization

Accept-Ranges: bytes

Content-Type: text/html; charset=UTF-8