text:
Search this site
Bảng Điều Khiển
Trang chủ
Thông báo chung
Sitemap
Bài giảng môn học
Tin học đại cương A1
Lập trình C++ (A2)
LT Hướng Đối Tượng
Cấu trúc dữ liệu 1
Cấu trúc dữ liệu 2
Mạng máy tính
Cơ sở dữ liệu
Web với PHP&MySQL
ĐH KTCN Long An
Nhập môn tin học
ĐH Tôn Đức Thắng
Java
DotNet
Cơ sở tin học
CSTH 1
Bài viết liên về GD
Abraham Lincoln - GD
Bài viết khác
Google 6 ứng dụng
VS Team System
Phần Mềm MS Miễn Phí
XP to Window 7
Dịch vụ đám mây
Doanh nhân web 2.0
Hệ điều hành đám mây
Liên kết web
Trường ĐHSP Tp. HCM
Email trường
Khoa Toán Tin
Email khoa
Báo tuổi trẻ
Báo vnexpress
Lượt truy cập
LT Hướng Đối Tượng
>
LTHĐT_Hỗ trợ
>
Các nguyên lý lập trình hướng đối tượng
Dec 20, 2010, 12:57 AM
by Tran Phuoc Tuan
Các nguyên lý lập trình hướng đối tượng
Phương pháp lập trình hướng đối tượng đã được nghiên cứu và phát triển từ lâu nhưng việc vận dụng nó như thế nào cho hiệu quả trong việc xây dựng phần mềm là điều vẫn còn khá mơ hồ đối với nhiều người. Thế nào là một phần mềm hướng đối tượng? Đâu là những cơ sở nền tảng để xây dựng được phần mềm theo tư tưởng hướng đối tượng đúng nghĩa? Trong bài viết này, trình bày về các
nguyên lý
lập trình hướng đối tượng. Đó là những quy tắc phân tích thiết kế hướng đối tượng cơ bản, mang tính chất khái quát. Nó được xem như "kim chỉ nam" soi đường dẫn lối cho chúng ta khi tiến hành phân tích thiết kế theo tư tưởng hướng đối tượng. Do là nguyên lý nên nó có tính trừu tượng cao chứ không đi vào chi tiết cách thức giải quyết vấn đề cụ thể (việc hiện thực hóa những nguyên lý lập trình hướng đối tượng đòi hỏi chúng ta phải xem xét đến Design Patterns)
Các nguyên lý lập trình hướng đối tượng (The OOP Principles)
Nguyên lý Open-Closed
(The Open-Closed Principle)
Phát biểu
Các thực thể phần mềm (hàm, đơn thể, đối tượng, …) nên được xây dựng theo hướng mở cho việc mở rộng (
be opened for extension
) nhưng đóng đối với việc sửa đổi (
be closed for modification
).
Nội dung
Các thực thể trong một phần mềm không đứng riêng lẻ mà có sự gắn kết chặt chẽ với nhau. Chúng phối hợp hoạt động để cùng nhau thực hiện các chức năng của phần mềm. Do đó, việc nâng cấp, mở rộng một thực thể nào đó sẽ ảnh hưởng đến những thực thể liên quan. Điều này có thể dẫn đến việc phải nâng cấp, mở rộng cả những thực thể liên quan đó. Và trong thời đại đầy biến động hiện nay, việc phải thường xuyên nâng cấp, mở rộng các thực thể trong phần mềm là điều khó tránh khỏi.
Để làm cho quá trình bảo trì, nâng cấp, mở rộng phần mềm diễn ra dễ dàng và hiệu quả hơn, các thực thể phần mềm nên được xây dựng tuân theo nguyên lý Open-Closed. Điều này có nghĩa là các thực thể phần mềm nên được xây dựng sao cho việc nâng cấp, mở rộng đồng nghĩa với việc thêm vào những cái mới chứ không phải là thay đổi những cái hiện có, từ đó tránh được việc phải thay đổi các thực thể liên quan.
Xét ví dụ một đoạn chương trình vẽ đường thẳng và hình chữ nhật bằng C#.
public enum ShapeType
{
LINE,
RECTANGLE
}
public abstract class Shape
{
public abstract ShapeType getType();
}
public class Line: Shape
{
public override ShapeType getType()
{
return ShapeType.LINE;
}
public void drawLine()
{
// Draws the line...
}
}
public class Rectangle: Shape
{
public override ShapeType getType()
{
return ShapeType.RECTANGLE;
}
public void drawRectangle()
{
// Draws the rectangle...
}
}
public void draw(ArrayList shapeList)
{
Line line;
Rectangle rectangle;
foreach (Shape s in shapeList)
switch (s.getType())
{
case ShapeType.LINE:
line = (Line)s;
line.drawLine();
break;
case ShapeType.RECTANGLE:
rectangle = (Rectangle)s;
rectangle.drawRectangle();
break;
}
}
Đoạn chương trình trên hoạt động rất tốt cho đến khi có sự nâng cấp, mở rộng. Giả sử chúng ta cần nâng cấp, mở rộng đoạn chương trình trên để nó có thể vẽ thêm được hình tròn. Lúc bấy giờ ta phải chỉnh sửa lại hàm “draw”, thêm vào một trường hợp vẽ hình tròn. Và trong nhiều tình huống, việc chỉnh sửa hàm “draw” sẽ dẫn đến việc chỉnh sửa những hàm khác liên quan. Hàm “draw” được viết theo cách này được nói là không tuân thủ nguyên lý Open-Closed.
Để đoạn chương trình trên tuân thủ nguyên lý Open-Closed, chúng ta sử dụng tính đa hình của lập trình hướng đối tượng.
public abstract class Shape
{
public abstract void draw();
}
public class Line: Shape
{
public override void draw()
{
// Draws the line...
}
}
public class Rectangle: Shape
{
public override void draw()
{
// Draws the rectangle...
}
}
class Circle: Shape
{
public override void draw()
{
// Draws the circle...
}
}
public void draw(ArrayList shapeList)
{
foreach (Shape s in shapeList)
s.draw();
}
Với đoạn chương trình trên, khi thêm một hình mới vào, chúng ta chỉ việc thêm lớp đối tượng cho hình đó (kế thừa từ Shape) mà không cần phải chỉnh sửa lại hàm “draw”. Nó vẫn hoạt động tốt với những hình mới thêm vào.
Ghi chú
i) Không phải lúc nào tất cả các thực thể trong phần mềm đều có thể tuân thủ nguyên lý Open-Closed. Nhưng mục tiêu của phân tích thiết kế hướng đối tượng là phải làm sao cho số lượng các thực thể tuân thủ nguyên lý là lớn nhất, trong đó ưu tiên các thực thể thường xuyên phải nâng cấp, mở rộng thỏa nguyên lý.
ii) Việc tuân thủ nguyên lý Open-Closed của một thực thể phần mềm chỉ mang tính tương đối, phụ thuộc vào ngữ cảnh. Có thể trong ngữ cảnh này, thực thể thỏa nguyên lý, nhưng trong một ngữ cảnh khác, thực thể này không còn tuân thủ nguyên lý nữa. Mục tiêu của phân tích thiết kế hướng đối tượng là phải làm sao cho có nhiều thực thể phần mềm nhất tuân thủ nguyên lý trong ngữ cảnh thường xảy ra nhất của phần mềm, trong đó ưu tiên các thực thể thường xuyên phải nâng cấp, mở rộng thỏa nguyên lý.
Ví dụ trường hợp hàm “draw” như trong đoạn chương trình vẽ hình trên.
public void draw(ArrayList shapeList)
{
foreach (Shape s in shapeList)
s.draw();
}
Hàm “draw” chỉ thỏa nguyên lý trong ngữ cảnh nâng cấp mở rộng là “thêm hình mới”. Nếu chúng ta cần nâng cấp, mở rộng theo hướng thay đổi thứ tự vẽ các hình thì hàm “draw” như trên là không thể đáp ứng được. Khi đó nó không còn tuân thủ nguyên lý nữa.
iii) Một tính chất quan trọng trong lập trình hướng đối tượng giúp cho các thực thể phần mềm tăng khả năng tuân thủ nguyên lý Open-Closed là tính đóng gói (encapsulation). Đối tượng nắm giữ thông tin và chịu trách nhiệm trên thông tin mình nắm giữ. Điều này giúp hạn chế sự kết dính (
coupling
) giữa các lớp đối tượng với nhau. Trường hợp lý tưởng là tất cả thuộc tính của đối tượng được đặt tầm vực private. việc thay đổi trên thuộc tính chỉ có thể được thực hiên thông qua những xử lý của phương thức. Những phương thức của đối tượng khác, kể cả đối tượng kế thừa không thể truy xuất được đến những thuộc tính này.
iv) Việc hạn chế sử dụng ép kiểu động (
runtime type-casting
) trong các thực thể phần mềm cũng sẽ giúp làm tăng khả năng tuân thủ nguyên lý Open-Closed của chúng. Vì bản chất của việc ép kiểu động là làm việc với một kiểu dữ liệu cụ thể. Khi muốn nâng cấp, mở rộng thực thể để nó có thể làm việc với những kiểu dữ liệu khác, đoạn chương trình sử dụng ép kiểu động phải được thay đổi để có thể làm việc được với các kiểu dữ liệu khác này.
public void doSomething(Vehicle vehicle)
{
Car car = (Car)vehicle;
car.run();
car.stop();
}
Khi cần nâng cấp, mở rộng để đoạn chương trình trên có thể làm việc được với các lớp đối tượng khác kế thừa từ “Vehicle”, chúng ta phải chỉnh sửa lại nó.
Ý nghĩa
Nguyên lý Open-Closed là nguyên lý cốt lõi và là một trong bốn nguyên lý cơ bản làm nền tảng cho phân tích thiết kế hướng đối tượng. Nó giúp cho phần mềm dễ bảo trì, nâng cấp và mở rộng.
Nguyên lý Nghịch đảo phụ thuộc
(The Dependency Inversion Principle)
Phát biểu
Các thành phần trong phần mềm không nên phụ thuộc vào những cái riêng, cụ thể (
details
) mà ngược lại nên phụ thuộc vào những cái chung, tổng quát (
abstractions
) của những cái riêng, cụ thể đó.
Những cái chung, tổng quát (
abstractions
) không nên phụ vào những cái riêng, cụ thể (
details
). Sự phụ thuộc này nên được đảo ngược lại.
Nội dung
Những cái chung, tổng quát là tập hợp của những đặc tính chung nhất từ những cái riêng, cụ thể. Những cái riêng, cụ thể dù khác nhau thế nào đi nữa cũng đều tuân theo các quy tắc chung mà cái chung, tổng quát của nó đã định nghĩa. Những cái chung, tổng quát là những cái ít thay đổi và ít biến động. Trong khi đó, sự thay đổi lại thường xuyên xảy ra ở những cái riêng, cụ thể. Việc phụ thuộc vào những cái chung, tổng quát sẽ giúp cho các thành phần trong phần mềm trở nên linh động (
flexible
) và thích ứng tốt với sự thay đổi thường xuyên diễn ra ở những cái riêng, cụ thể. Khi phụ thuộc vào những cái chung, tổng quát, các thành phần trong phần mềm vẫn có thể hoạt động tốt mà không cần phải sửa đổi một khi cái riêng, cụ thể được thay thế bằng một cái riêng, cụ thể khác cùng loại.
Lấy ví dụ đoạn chương trình đọc dữ liệu từ bàn phím và xuất ra máy in.
public void copy()
{
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
char c;
while ((c = keyboard.read()) != ‘q’)
printer.write(c);
}
Khi nâng cấp, mở rộng đoạn chương trình trên để nó có thể xuất dữ liệu ra máy in hoặc tập tin thì chúng ta phải chỉnh sửa lại đoạn chương trình trên như sau.
public void copy(OutputType type)
{
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
File file = new File();
char c;
while ((c = keyboard.read()) != ‘q’)
if (type == OutputType.PRINTER)
printer.write(c);
else if (type == OutputType.FILE)
file.write(c);
}
Rõ ràng hàm “copy” như trên đã vi phạm nguyên lý Open-Closed do khi mỗi lần cần thêm một thiết bị đọc ghi mới vào, chúng ta phải chỉnh sửa lại nó. Nguyên nhân làm cho hàm “copy” vi phạm nguyên lý Open-Closed là do nó làm việc với từng thiết bị đọc ghi cụ thể. Khi thêm một thiết bị đọc ghi mới, chúng ta phải thêm vào hàm “copy” đoạn lệnh để làm việc với thiết bị đọc ghi mới. Khi đó chúng ta nói hàm “copy” vi phạm nguyên lý Nghịch đảo phụ thuộc.
Để đoạn chương trình trên tuân thủ Nguyên lý Nghịch đảo phụ thuộc, từ đó tuân thủ Nguyên lý Open-Closed, chúng ta phải cho nó làm việc với thiết bị đọc ghi tổng quát.
public void copy(Reader reader, Writer writer)
{
char c;
while ((c = reader.read()) != ‘q’)
writer.write(c);
}
Hàm “copy” như trên có thể làm việc tốt với bất kỳ thiết bị đọc ghi nào tuân thủ interface của Reader và Writer. Khi cần thêm thiết bị đọc ghi mới, chúng ta chỉ việc thêm lớp đối tượng kế thừa từ Reader hoặc Writer mà không phải chỉnh sửa lại hàm “copy”.
Trích lời
Allen Holub:
“The more abstraction you add, the greater the flexibility. In today’s business environment, where requirements regularly change as program develops, this flexibility is essential.”
.
Chú ý
i) Nguyên lý Nghịch đảo phụ thuộc có mối liên hệ mật thiết với nguyên lý Open-Closed. Một khi nguyên lý Nghịch đảo phụ thuộc bị vi phạm, có nghĩa là những thành phần trong phần mềm phụ thuộc vào những cái riêng, cụ thể, việc nâng cấp, mở rộng ở những cái riêng, cụ thể (điều này rất thường xảy ra) buộc những thành phần phụ thuộc vào nó bị thay đổi theo. Điều này dẫn đến vi phạm nguyên lý Open-Closed.
ii) Sự nghịch đảo được đề cập đến ở đây nhằm nhấn mạnh đến việc cần phải thay đổi quan điểm trong phân tích thiết kế phần mềm. Theo lối suy nghĩ “chia để trị” của lập trình hướng cấu trúc, những công việc lớn, phức tạp, mang tính trừu tượng cao thường được phân ra thành những công việc nhỏ, đơn giản và cụ thể hơn. Khi đó, cấu trúc phần mềm có xu hướng theo dạng những thành phần lớn (trừu tượng) gọi đến những thành phần nhỏ (cụ thể) hơn để yêu cầu chúng thực hiện công việc. Điều này thường làm cho những thành phần trong phần mềm phụ thuộc vào những cái riêng, cụ thể. Trong phân tích thiết kế hướng đối tượng, sự phụ thuộc này nên được đảo ngược lại.
iii) Một thành phần trong phần mềm vi phạm nguyên lý Nghịch đảo phụ thuộc sẽ có tính tái sử dụng (reusability) không cao. Việc mang những thành phần này sử dụng vào một ngữ cảnh khác với những cái riêng, cụ thể khác là khó có thể thực hiện được nếu như không thực hiện việc chỉnh sửa nào trên chúng.
iv) Một quy ước trong lập trình hướng đối tượng giúp cho các thành phần trong phần mềm tăng khả năng tuân thủ nguyên lý Nghịch đảo phụ thuộc là thực hiện việc truy xuất đến các đối tượng thông qua interface của chúng. Điều này sẽ làm cho các thành phần bên trong phần mềm có tính linh động (flexibility) cao, không phải sửa đổi khi thay thế các đối tượng được truy xuất đến bằng đối tượng khác cùng loại.
public void doSomething(Car car)
{
car.run();
car.stop();
}
public void doSomething(Vehicle vehicle)
{
vehicle.run();
vehicle.stop();
}
Trong hai đoạn chương trình trên, đoạn chương trình thứ hai vẫn làm việc tốt khi chúng ta thêm vào các đối tượng khác cùng loại với “Car” mà kế thừa từ “Vehicle”.
Ý nghĩa
Nguyên lý Nghịch đảo phụ thuộc có mối liên hệ mật thiết với nguyên lý Open-Closed và là một trong bốn nguyên lý cơ bản làm nền tảng cho phân tích thiết kế hướng đối tượng. Nó giúp cho phần mềm có tính tái sử dụng cao, linh động và bền vững (robustness) trước những sự thay đổi.
Nguyên lý Thay thế Liskov
(The Liskov Substitution Principle)
Phát biểu
Lớp B chỉ nên kế thừa từ lớp A khi và chỉ khi với mọi hàm F thao tác trên các đối tượng của A, cách cư xử (behaviors) của F không thay đổi khi ta thay thế (substitute) các đối tượng của A bằng các đối tượng của B.
Nội dung
Kế thừa (inheritance) là một trong những tính chất cơ bản của lập trình hướng đối tượng. Đó là khả năng định nghĩa một lớp đối tượng dựa trên các lớp đối tượng đã được định nghĩa trước đó. Các đối tượng của lớp kế thừa có khả năng cư xử (behave) như các đối tượng của lớp cơ sở. Điều này có nghĩa là các đối tượng của lớp kế thừa hoàn toàn có thể thay thế các đối tượng của lớp cơ sở trong những hàm thao tác trên các đối tượng của lớp cơ sở.
Chính vì tính chất này mà chúng ta không thể sử dụng kế thừa một cách tùy tiện. Giả sử ta có lớp A và hàm F thao tác trên các đối tượng của A. Để nâng cấp, mở rộng phần mềm, ta cần thêm vào lớp B kế thừa từ A. Nhưng việc thay thế các đối tượng của A bằng các đối tượng của B lại làm cho F cư xử sai lệch so với trước khi thực hiện việc thay thế. Lúc này, để F có thể cư xử không đổi so với trước, ta phải chỉnh sửa lại F. Điều này làm cho F vi phạm nguyên lý Open-Closed.
Đoạn chương trình sau cho thấy việc kế thừa tùy tiện chỉ với mục đích tái sử dụng nguy hiểm như thế nào.
public class Stack
{
private ArrayList data;
// More data members of stack.
public virtual void push(int n)
{
// Pushes n to stack...
}
public virtual int pop()
{
// Pops value from stack...
}
}
public class Queue: Stack
{
// Data members of Queue.
public override void push(int n)
{
// Pushes n to queue...
}
public override int pop()
{
// Pops value from queue...
}
}
public int func(Stack p)
{
p.push(5);
p.push(6);
p.push(7);
int a = p.pop();
int b = p.pop();
if (a == 7 && b == 6)
return a * b;
throw new ArgumentException();
}
Với mục đích tái sử dụng là một số thuộc tính và phương thức trong “Stack”, chúng ta cho “Queue” kế thừa từ Stack. Xét hàm “func” thao tác trên đối tượng của “Stack”, do “Queue” kế thừa từ “Stack” nên chúng ta hoàn toàn có thể truyền đối tượng của “Queue” vào hàm này. Nhưng cách cư xử của hàm “func” khi thao tác trên các đối tượng của “Stack” và “Queue” là khác nhau. Với các đối tượng của “Stack” hàm func luôn trả về chính xác tích của hai số 7 và 6. Nhưng với các đối tượng của “Queue” hàm func lại luôn gây ra một exception. Để hàm “func” có thể cư xử trên các đối tượng của “Stack” và “Queue” như nhau, chúng ta phải viết lại nó. Điều này làm cho hàm “func” vi phạm nguyên lý Open-Closed. Khi đó ta nói hàm “func” vi phạm nguyên lý Thay thế Liskov.
Chú ý
i) Nguyên lý Thay thế Liskov có mối liên hệ mật thiết với Nguyên lý Open-Closed. Sự vi phạm nguyên lý Thay thế Liskov sẽ dẫn đến sự vi phạm nguyên lý Open-Closed. Một thực thể phần mềm vi phạm nguyên lý Thay thế Liskov sẽ cư xử khác nhau trên các đối tượng của lớp cơ sở và lớp kế thừa. Để thực thể phần mềm này vẫn có thể làm việc tốt trên các đối tượng của cả lớp cơ sở và lớp kế thừa, chúng ta phải chỉnh sửa lại nó. Điều này dẫn đến vi phạm nguyên lý Open-Closed.
ii) Không phải lúc nào tất cả các thực thể trong phần mềm đều có thể tuân thủ nguyên lý Thay thế Liskov. Nhưng mục tiêu của phân tích thiết kế hướng đối tượng là phải làm sao cho số lượng các thực thể tuân thủ nguyên lý là lớn nhất, trong đó ưu tiên các thực thể thường xuyên phải nâng cấp, mở rộng thỏa nguyên lý.
iii) Việc tuân thủ nguyên lý Thay thế Liskov của một thực thể phần mềm chỉ mang tính tương đối, phụ thuộc vào ngữ cảnh. Có thể trong ngữ cảnh này, thực thể thỏa nguyên lý, nhưng trong một ngữ cảnh khác, thực thể này không còn tuân thủ nguyên lý nữa. Mục tiêu của phân tích thiết kế hướng đối tượng là phải làm sao cho có nhiều thực thể phần mềm nhất tuân thủ nguyên lý trong ngữ cảnh thường xảy ra nhất của phần mềm, trong đó ưu tiên các thực thể thường xuyên phải nâng cấp, mở rộng thỏa nguyên lý.
iv) Quan hệ “IS-A” thường được dùng để phát hiện kế thừa. Khi lớp đối tượng B về mặt ngữ nghĩa là một trường hợp đặc biệt của lớp đối tượng A thì ta có thể cho B kế thừa từ A. Nhưng thực tế cho thấy, trong một số ngữ cảnh của phần mềm, một lớp đối tượng có quan hệ “IS-A” với những lớp đối tượng khác nhưng việc để nó kế thừa những lớp đối tượng này sẽ dẫn đến việc vi phạm nguyên lý Thay thế Liskov.
Xét đoạn chương trình sau.
public class Rectangle
{
// Data members of rectangle...
// Member functions of rectangle...
}
public class Square: Rectangle
{
// Data members of square...
// Member functions of square...
}
public double doSomething(Rectangle obj)
{
obj.setWidth(5);
obj.setHeight(6);
if (obj.Area == 30)
return obj.Area;
throw new ArgumentException();
}
Ở đoạn chương trình trên, mặc dù về mặt ngữ nghĩa, hình vuông là một trường hợp của hình chữ nhật. Điều này hoàn toàn đúng!!! Nhưng trong ngữ cảnh này, việc để “Square” kế thừa “Rectangle” là không phù hợp. Lúc này hàm “doSomething” cư xử khác nhau trên các đối tượng của “Rectangle” và “Square”. Như vậy hàm “doSomething” đã vi phạm nguyên lý Thay thế Liskov. Để hàm “doSomething” có thể làm việc được trên cả “Rectangle” và “Square” chúng ta phải chỉnh sửa lại nó. Như vậy việc vi phạm nguyên lý Thay thế Liskov đã làm cho hàm “doSomething” vi phạm nguyên lý Open-Closed.
v) Nguyên lý Thay thế Liskov có mối liên hệ mật thiết với kỹ thuật “Design by Contract” được đề cập bởi Bertrand Meyers. Kỹ thuật này chỉ ra rằng: mỗi phương thức trong một lớp đối tượng, khi được định nghĩa, đã hàm chứa trong nó tiền điều kiện (pre-condition) và hậu điều kiện (post-condition). Tiền điều kiện là những điều kiện cần để phương thức có thể thực hiện được. Hậu điều kiện là những ràng buộc phát sinh sau khi thực hiện phương thức. Khi thực hiện việc kế thừa, phương thức được định nghĩa lại trong lớp kế thừa phải có tiền điều kiện lỏng lẻo hơn (weaker) và hậu điều kiện chặt chẽ hơn (stronger). Điều này có nghĩa là trước khi thực hiện, phương thức được định nghĩa lại trong lớp kế thừa không được đòi hỏi nhiều hơn như khi nó được định nghĩa trong lớp cơ sở. Và sau khi thực hiện, phương thức được định nghĩa lại trong lớp kế thừa phải đảm bảo tất cả những ràng buộc phát sinh như khi nó được định nghĩa trong lớp cơ sở. Chỉ khi nào những điều trên được đáp ứng cho mọi phương thức trong lớp kế thừa thì lớp kế thừa mới được xem là cư xử như lớp cơ sở. Và khi đó, việc để nó kế thừa từ lớp cơ sở mới là đúng đắn trong ngữ cảnh phần mềm đang xét.
vi) Nguyên lý Thay thế Liskov và kỹ thuật “Design by Contract” vô tình làm cho việc kế thừa trở nên rất khó thực hiện. Khi cần thêm vào một lớp kế thừa, chúng ta phải xem xét rất kỹ lưỡng lại tất cả hàm có thao tác trên lớp cơ sở xem chúng có vi phạm nguyên lý Thay thế Liskov hay không. Chúng ta cũng cần phải xem xét tất cả các phương thức của lớp kế thừa xem chúng có vi phạm những quy định của kỹ thuật “Design by Contract” hay không. Tất cả những điều này là do lớp kế thừa có một mối liên hệ mật thiết với lớp cơ sở. Lớp kế thừa bị kết dính (coupling) chặt chẽ với lớp cơ sở. Sự kết dính này rõ ràng làm cho phần mềm kém linh động (flexibility) một khi có sự thay đổi xảy ra. Do đó, để hạn chế sự kết dính này mà vẫn đảm bảo được tính tái sử dụng, chúng ta chỉ nên kế thừa interface và sử dụng composition thay cho việc kế thừa.
Ý nghĩa
Nguyên lý Thay thế Liskov có mối liên hệ mật thiết với nguyên lý Open-Closed và là một trong bốn nguyên lý cơ bản làm nền tảng cho phân tích thiết kế hướng đối tượng. Nó giúp nâng cao tính tái sử dụng và bền vững của phần mềm trước những sự thay đổi.
Nguyên lý Phân tách interface
(The Interface Segregation)
Phát biểu
Không nên buộc các thực thể phần mềm phụ thuộc vào những interface mà chúng không sử dụng đến.
Nội dung
Khi xây dựng một lớp đối tượng, đặc biệt là những lớp trừu tượng (abstract class), nhiều người thường có xu hướng để cho lớp đối tượng thực hiện càng nghiều chức năng càng tốt, đưa thật nhiều thuộc tính và phương thức vào lớp đối tượng đó. Những lớp đối tượng như vậy được gọi là những lớp đối tượng có interface bị “ô nhiễm” (fat interface or polluted interface).
Khi một lớp đối tượng có interface bị “ô nhiễm”, nó sẽ trở nên cồng kềnh. Một thực thể phần mềm nào đó chỉ cần thực hiện một công việc đơn giản mà lớp đối tượng này hỗ trợ buộc phải làm việc với toàn bộ interface của lớp đối tượng đó. Việc phải truyền đi truyền lại nhiều lần những đối tượng có interface bị “ô nhiễm” sẽ làm giảm hiệu năng của phần mềm.
Đặc biệt đối với lớp trừu tượng có interface bị “ô nhiễm”, một số lớp kế thừa chỉ quan tâm đến một phần interface của lớp cơ sở nhưng bị buộc phải thực hiện việc cài đặt cho cả phần interface không hề có ý nghĩa đối với chúng. Điều này dẫn đến sự dư thừa không cần thiết trong các thực thể phần mềm. Quan trọng hơn nữa, việc buộc các lớp kế thừa phụ thuộc vào phần interface mà chúng không sử dụng đến sẽ làm tăng sự kết dính (coupling) giữa các thực thể phần mềm. Một khi sự nâng cấp, mở rộng diễn ra, đòi hỏi phần interface đó phải thay đổi, các lớp kế thừa này bị buộc phải chỉnh sửa theo. Điều này làm cho chúng vi phạm nguyên lý Open-Closed.
Hình bên dươi là sơ đồ lớp cho đoạn chương trình tính điện trở mạch điện. “Resistor” và “Lamp” là những mạch điện đơn giản với điện trở là một thuộc tính của mạch. Trong khi “SeriesCircuit” và “ParallelCircuit” là những mạch điện phức hợp với điện trở của mạch được tính từ các mạch điện con. Để có thể cư xử như nhau trên các loại mạch điện này hay nói cách khác là truy xuất đến chúng một cách “trong suốt” (transparency), chúng ta có “Circuit” là lớp trừu tượng chung đại diện cho các mạch điện khác nhau.
Lớp “Circuit” được thiết kế như trên được gọi là có interface bị “ô nhiễm”. “Resistor” và “Lamp” bị buộc phải thực hiện việc cài đặt cho các phương thức “add” và “remove” hoàn toàn chẳng có ý nghĩa gì với chúng. Điều này gây ra sự dư thừa code không cần thiết cũng như gây “khó chịu” cho những thực thể phần mềm khác sử dụng “Resistor” và “Lamp”.
Nhưng vấn đề chỉ thật sự xảy ra khi chúng ta nâng cấp, mở rộng đoạn chương trình trên. Giả sử chúng ta cần thêm vào phương thức “removeAt” để hỗ trợ việc xóa mạch điện con tại vị trí nào đó trong mạch điện phức hợp. Lúc này, chúng ta phải thực hiện việc chỉnh sửa trên tất cả các lớp đối tượng kế thừa từ “Circuit”. Việc chỉnh sửa trên “SeriesCircuit” và “ParallelCircuit” xem ra còn có thể chấp nhận được. Nhưng việc phải chỉnh sửa trên “Resistor” và “Lamp” là không thể chấp nhận được vì phương thức “removeAt” chẳng hề có ý nghĩa gì đối với chúng. Điều này rõ ràng làm cho “Resistor” và “Lamp” vi phạm nguyên lý Open-Closed một cách “không chính đáng”.
Chú ý
i) Nguyên lý Phân tách interface có mối liên hệ với nguyên lý Open-Closed. Sự vi phạm nguyên lý Phân tách interface có khả năng dẫn đến sự vi phạm nguyên lý Open-Closed (xem phân tích ở trên).
ii) Để tránh vi phạm nguyên lý Phân tách Inteface, chúng ta nên giữ cho interface của lớp đối tượng đơn giản và gọn nhẹ, nên làm theo tiêu chí “a class should do one thing and do it well”. Chúng ta không nên để cho lớp đối tượng đảm nhận quá nhiều trách nhiệm vì điều này dễ làm cho interface của nó bị “ô nhiễm”.
iii) Interface bị “ô nhiễm” của lớp đối tượng nên được phân tách ngay khi có thể để tránh khả năng dẫn đến sự vi phạm nguyên lý Open-Closed. Việc phân tách interface bị “ô nhiễm” của một lớp cơ sở có thể được thực hiện thông qua việc tăng thêm mức độ trừu tượng trong cây kế thừa của nó. Lớp cơ sở ban đầu chỉ nên có interface đơn giản mà mọi lớp kế thừa của nó đều cần phải có. Sau đó, phần interface chung của một bộ phận lớp kế thừa được tổng hợp lại trong một lớp cơ sở. Và lớp cơ sở này lại kế thừa từ lớp cơ sở ban đầu. Như vậy những lớp kế thừa thuộc nhánh khác không bị phụ thuộc vào phần interface mà chúng không sử dụng đến của bộ phận lớp kế thừa kia.
Với trường hợp đoạn chương trình tính điện trở mạch điện, để giải quyết vấn đề interface của “Circuit” bị “ô nhiễm”, chúng ta tăng thêm một mức độ trừu tượng trong cây kế thừa của nó. Khi đó, “Circuit” đóng vai trò là lớp trừu tượng cho các mạch điện khác nhau. Nó chỉ chứa phần interface chung nhất của tất cả các mạch điện này. Và trong ngữ cảnh bài toán tính điện trở đơn giản thì nó chỉ chứa phương thức “calcResistance”.
Chúng ta sẽ có lớp “SingleCircuit” đại diện cho các mạch điện đơn giản và “ComplexCircuit” đại diện cho cách mạch điện phức hợp. “SingleCircuit” chứa phần interface chung của các mạch điện đơn giản như “Resistor” và “Lamp” trong khi “ComplexCircuit” chứa phần interface chung của các mạch điện phức hợp. Chúng ta sẽ có được cây kế thừa như hình bên dưới.
Lúc này, khi cần thêm vào phương thức “removeAt” chúng ta chỉ việc nâng cấp phần interface của “ComplexCircuit”, nhánh kế thừa bên “SingleCircuit” sẽ không bị ảnh hưởng.
iv) Trong một số trường hợp, sau khi phân tách interface, một số lớp kế thừa mới thêm vào muốn sử dụng những phần interface đã phân tách, chúng có thể thực hiện việc đa kế thừa từ những lớp đối tượng hỗ trợ những phần interface này hoặc cũng có thể kế thừa từ một lớp đối tượng hỗ trợ một phần interface chúng cần và thực hiện composition đối với những đối tượng hỗ trợ phần interface còn lại.
Ý nghĩa
Nguyên lý Phân tách interface có mối liên hệ với nguyên lý Open-Closed và là một trong bốn nguyên lý cơ bản làm nền tảng cho phân tích thiết kế hướng đối tượng. Nó giúp giảm sự cồng kềnh, dư thừa không cần thiết cho phần mềm và quan trọng hơn là giảm sự kết dính (copuling) làm hạn chế tính linh động (flexibility) của phần mềm.
Sưu tầm: http://www.ciren.gov.vn/forums/showthread.php?t=528
Comments
Sign in
|
Recent Site Activity
|
Report Abuse
|
Print Page
|
Powered By
Google Sites

markdown:
Các nguyên lý lập trình hướng đối tượng
Phương pháp lập trình hướng đối tượng đã được nghiên cứu và phát triển từ lâu nhưng việc vận dụng nó như thế nào cho hiệu quả trong việc xây dựng phần mềm là điều vẫn còn khá mơ hồ đối với nhiều người. Thế nào là một phần mềm hướng đối tượng? Đâu là những cơ sở nền tảng để xây dựng được phần mềm theo tư tưởng hướng đối tượng đúng nghĩa? Trong bài viết này, trình bày về các
nguyên lý lập trình hướng đối tượng. Đó là những quy tắc
phân tích thiết kế hướng đối tượng cơ bản, mang tính chất khái quát. Nó
được xem như "kim chỉ nam" soi đường dẫn lối cho chúng ta khi tiến hành
phân tích thiết kế theo tư tưởng hướng đối tượng. Do là nguyên lý nên
nó có tính trừu tượng cao chứ không đi vào chi tiết cách thức giải
quyết vấn đề cụ thể (việc hiện thực hóa những nguyên lý lập trình hướng
đối tượng đòi hỏi chúng ta phải xem xét đến Design Patterns) Các nguyên lý lập trình hướng đối tượng (The OOP Principles)
Nguyên lý Open-Closed
(The Open-Closed Principle)
Phát biểu
Các thực thể phần mềm (hàm, đơn thể, đối tượng, …) nên được xây dựng theo hướng mở cho việc mở rộng (
be opened for extension) nhưng đóng đối với việc sửa đổi ( be closed for modification).
Nội dung
Các thực thể trong một phần mềm không đứng riêng lẻ mà có sự gắn kết chặt chẽ với nhau. Chúng phối hợp hoạt động để cùng nhau thực hiện các chức năng của phần mềm. Do đó, việc nâng cấp, mở rộng một thực thể nào đó sẽ ảnh hưởng đến những thực thể liên quan. Điều này có thể dẫn đến việc phải nâng cấp, mở rộng cả những thực thể liên quan đó. Và trong thời đại đầy biến động hiện nay, việc phải thường xuyên nâng cấp, mở rộng các thực thể trong phần mềm là điều khó tránh khỏi.
Để làm cho quá trình bảo trì, nâng cấp, mở rộng phần mềm diễn ra dễ dàng và hiệu quả hơn, các thực thể phần mềm nên được xây dựng tuân theo nguyên lý Open-Closed. Điều này có nghĩa là các thực thể phần mềm nên được xây dựng sao cho việc nâng cấp, mở rộng đồng nghĩa với việc thêm vào những cái mới chứ không phải là thay đổi những cái hiện có, từ đó tránh được việc phải thay đổi các thực thể liên quan.
Xét ví dụ một đoạn chương trình vẽ đường thẳng và hình chữ nhật bằng C#.
public enum ShapeType
{
LINE,
RECTANGLE
}
public abstract class Shape
{
public abstract ShapeType getType();
}
public class Line: Shape
{
public override ShapeType getType()
{
return ShapeType.LINE;
}
public void drawLine()
{
// Draws the line...
}
}
public class Rectangle: Shape
{
public override ShapeType getType()
{
return ShapeType.RECTANGLE;
}
public void drawRectangle()
{
// Draws the rectangle...
}
}
public void draw(ArrayList shapeList)
{
Line line;
Rectangle rectangle;
foreach (Shape s in shapeList)
switch (s.getType())
{
case ShapeType.LINE:
line = (Line)s;
line.drawLine();
break;
case ShapeType.RECTANGLE:
rectangle = (Rectangle)s;
rectangle.drawRectangle();
break;
}
}
Đoạn chương trình trên hoạt động rất tốt cho đến khi có sự nâng cấp, mở rộng. Giả sử chúng ta cần nâng cấp, mở rộng đoạn chương trình trên để nó có thể vẽ thêm được hình tròn. Lúc bấy giờ ta phải chỉnh sửa lại hàm “draw”, thêm vào một trường hợp vẽ hình tròn. Và trong nhiều tình huống, việc chỉnh sửa hàm “draw” sẽ dẫn đến việc chỉnh sửa những hàm khác liên quan. Hàm “draw” được viết theo cách này được nói là không tuân thủ nguyên lý Open-Closed.
Để đoạn chương trình trên tuân thủ nguyên lý Open-Closed, chúng ta sử dụng tính đa hình của lập trình hướng đối tượng.
public abstract class Shape
{
public abstract void draw();
}
public class Line: Shape
{
public override void draw()
{
// Draws the line...
}
}
public class Rectangle: Shape
{
public override void draw()
{
// Draws the rectangle...
}
}
class Circle: Shape
{
public override void draw()
{
// Draws the circle...
}
}
public void draw(ArrayList shapeList)
{
foreach (Shape s in shapeList)
s.draw();
}
Với đoạn chương trình trên, khi thêm một hình mới vào, chúng ta chỉ việc thêm lớp đối tượng cho hình đó (kế thừa từ Shape) mà không cần phải chỉnh sửa lại hàm “draw”. Nó vẫn hoạt động tốt với những hình mới thêm vào.
Ghi chú
i) Không phải lúc nào tất cả các thực thể trong phần mềm đều có thể tuân thủ nguyên lý Open-Closed. Nhưng mục tiêu của phân tích thiết kế hướng đối tượng là phải làm sao cho số lượng các thực thể tuân thủ nguyên lý là lớn nhất, trong đó ưu tiên các thực thể thường xuyên phải nâng cấp, mở rộng thỏa nguyên lý.
ii) Việc tuân thủ nguyên lý Open-Closed của một thực thể phần mềm chỉ mang tính tương đối, phụ thuộc vào ngữ cảnh. Có thể trong ngữ cảnh này, thực thể thỏa nguyên lý, nhưng trong một ngữ cảnh khác, thực thể này không còn tuân thủ nguyên lý nữa. Mục tiêu của phân tích thiết kế hướng đối tượng là phải làm sao cho có nhiều thực thể phần mềm nhất tuân thủ nguyên lý trong ngữ cảnh thường xảy ra nhất của phần mềm, trong đó ưu tiên các thực thể thường xuyên phải nâng cấp, mở rộng thỏa nguyên lý.
Ví dụ trường hợp hàm “draw” như trong đoạn chương trình vẽ hình trên.
public void draw(ArrayList shapeList)
{
foreach (Shape s in shapeList)
s.draw();
}
Hàm “draw” chỉ thỏa nguyên lý trong ngữ cảnh nâng cấp mở rộng là “thêm hình mới”. Nếu chúng ta cần nâng cấp, mở rộng theo hướng thay đổi thứ tự vẽ các hình thì hàm “draw” như trên là không thể đáp ứng được. Khi đó nó không còn tuân thủ nguyên lý nữa.
iii) Một tính chất quan trọng trong lập trình hướng đối tượng giúp cho các thực thể phần mềm tăng khả năng tuân thủ nguyên lý Open-Closed là tính đóng gói (encapsulation). Đối tượng nắm giữ thông tin và chịu trách nhiệm trên thông tin mình nắm giữ. Điều này giúp hạn chế sự kết dính (
coupling)
giữa các lớp đối tượng với nhau. Trường hợp lý tưởng là tất cả thuộc
tính của đối tượng được đặt tầm vực private. việc thay đổi trên thuộc
tính chỉ có thể được thực hiên thông qua những xử lý của phương thức.
Những phương thức của đối tượng khác, kể cả đối tượng kế thừa không thể
truy xuất được đến những thuộc tính này.
iv) Việc hạn chế sử dụng ép kiểu động (
runtime type-casting)
trong các thực thể phần mềm cũng sẽ giúp làm tăng khả năng tuân thủ
nguyên lý Open-Closed của chúng. Vì bản chất của việc ép kiểu động là
làm việc với một kiểu dữ liệu cụ thể. Khi muốn nâng cấp, mở rộng thực
thể để nó có thể làm việc với những kiểu dữ liệu khác, đoạn chương
trình sử dụng ép kiểu động phải được thay đổi để có thể làm việc được
với các kiểu dữ liệu khác này.
public void doSomething(Vehicle vehicle)
{
Car car = (Car)vehicle;
car.run();
car.stop();
}
Khi cần nâng cấp, mở rộng để đoạn chương trình trên có thể làm việc được với các lớp đối tượng khác kế thừa từ “Vehicle”, chúng ta phải chỉnh sửa lại nó.
Ý nghĩa
Nguyên lý Open-Closed là nguyên lý cốt lõi và là một trong bốn nguyên lý cơ bản làm nền tảng cho phân tích thiết kế hướng đối tượng. Nó giúp cho phần mềm dễ bảo trì, nâng cấp và mở rộng.
Nguyên lý Nghịch đảo phụ thuộc
(The Dependency Inversion Principle)
Phát biểu
Các thành phần trong phần mềm không nên phụ thuộc vào những cái riêng, cụ thể (
details) mà ngược lại nên phụ thuộc vào những cái chung, tổng quát ( abstractions) của những cái riêng, cụ thể đó.
Những cái chung, tổng quát (
abstractions) không nên phụ vào những cái riêng, cụ thể ( details). Sự phụ thuộc này nên được đảo ngược lại.
Nội dung
Những cái chung, tổng quát là tập hợp của những đặc tính chung nhất từ những cái riêng, cụ thể. Những cái riêng, cụ thể dù khác nhau thế nào đi nữa cũng đều tuân theo các quy tắc chung mà cái chung, tổng quát của nó đã định nghĩa. Những cái chung, tổng quát là những cái ít thay đổi và ít biến động. Trong khi đó, sự thay đổi lại thường xuyên xảy ra ở những cái riêng, cụ thể. Việc phụ thuộc vào những cái chung, tổng quát sẽ giúp cho các thành phần trong phần mềm trở nên linh động (
flexible)
và thích ứng tốt với sự thay đổi thường xuyên diễn ra ở những cái
riêng, cụ thể. Khi phụ thuộc vào những cái chung, tổng quát, các thành
phần trong phần mềm vẫn có thể hoạt động tốt mà không cần phải sửa đổi
một khi cái riêng, cụ thể được thay thế bằng một cái riêng, cụ thể khác
cùng loại.
Lấy ví dụ đoạn chương trình đọc dữ liệu từ bàn phím và xuất ra máy in.
public void copy()
{
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
char c;
while ((c = keyboard.read()) != ‘q’)
printer.write(c);
}
Khi nâng cấp, mở rộng đoạn chương trình trên để nó có thể xuất dữ liệu ra máy in hoặc tập tin thì chúng ta phải chỉnh sửa lại đoạn chương trình trên như sau.
public void copy(OutputType type)
{
Keyboard keyboard = new Keyboard();
Printer printer = new Printer();
File file = new File();
char c;
while ((c = keyboard.read()) != ‘q’)
if (type == OutputType.PRINTER)
printer.write(c);
else if (type == OutputType.FILE)
file.write(c);
}
Rõ ràng hàm “copy” như trên đã vi phạm nguyên lý Open-Closed do khi mỗi lần cần thêm một thiết bị đọc ghi mới vào, chúng ta phải chỉnh sửa lại nó. Nguyên nhân làm cho hàm “copy” vi phạm nguyên lý Open-Closed là do nó làm việc với từng thiết bị đọc ghi cụ thể. Khi thêm một thiết bị đọc ghi mới, chúng ta phải thêm vào hàm “copy” đoạn lệnh để làm việc với thiết bị đọc ghi mới. Khi đó chúng ta nói hàm “copy” vi phạm nguyên lý Nghịch đảo phụ thuộc.
Để đoạn chương trình trên tuân thủ Nguyên lý Nghịch đảo phụ thuộc, từ đó tuân thủ Nguyên lý Open-Closed, chúng ta phải cho nó làm việc với thiết bị đọc ghi tổng quát.
public void copy(Reader reader, Writer writer)
{
char c;
while ((c = reader.read()) != ‘q’)
writer.write(c);
}
Hàm “copy” như trên có thể làm việc tốt với bất kỳ thiết bị đọc ghi nào tuân thủ interface của Reader và Writer. Khi cần thêm thiết bị đọc ghi mới, chúng ta chỉ việc thêm lớp đối tượng kế thừa từ Reader hoặc Writer mà không phải chỉnh sửa lại hàm “copy”.
Trích lời Allen Holub:
“The
more abstraction you add, the greater the flexibility. In today’s
business environment, where requirements regularly change as program
develops, this flexibility is essential.” .
Chú ý
i) Nguyên lý Nghịch đảo phụ thuộc có mối liên hệ mật thiết với nguyên lý Open-Closed. Một khi nguyên lý Nghịch đảo phụ thuộc bị vi phạm, có nghĩa là những thành phần trong phần mềm phụ thuộc vào những cái riêng, cụ thể, việc nâng cấp, mở rộng ở những cái riêng, cụ thể (điều này rất thường xảy ra) buộc những thành phần phụ thuộc vào nó bị thay đổi theo. Điều này dẫn đến vi phạm nguyên lý Open-Closed.
ii) Sự nghịch đảo được đề cập đến ở đây nhằm nhấn mạnh đến việc cần phải thay đổi quan điểm trong phân tích thiết kế phần mềm. Theo lối suy nghĩ “chia để trị” của lập trình hướng cấu trúc, những công việc lớn, phức tạp, mang tính trừu tượng cao thường được phân ra thành những công việc nhỏ, đơn giản và cụ thể hơn. Khi đó, cấu trúc phần mềm có xu hướng theo dạng những thành phần lớn (trừu tượng) gọi đến những thành phần nhỏ (cụ thể) hơn để yêu cầu chúng thực hiện công việc. Điều này thường làm cho những thành phần trong phần mềm phụ thuộc vào những cái riêng, cụ thể. Trong phân tích thiết kế hướng đối tượng, sự phụ thuộc này nên được đảo ngược lại.
iii) Một thành phần trong phần mềm vi phạm nguyên lý Nghịch đảo phụ thuộc sẽ có tính tái sử dụng (reusability) không cao. Việc mang những thành phần này sử dụng vào một ngữ cảnh khác với những cái riêng, cụ thể khác là khó có thể thực hiện được nếu như không thực hiện việc chỉnh sửa nào trên chúng.
iv) Một quy ước trong lập trình hướng đối tượng giúp cho các thành phần trong phần mềm tăng khả năng tuân thủ nguyên lý Nghịch đảo phụ thuộc là thực hiện việc truy xuất đến các đối tượng thông qua interface của chúng. Điều này sẽ làm cho các thành phần bên trong phần mềm có tính linh động (flexibility) cao, không phải sửa đổi khi thay thế các đối tượng được truy xuất đến bằng đối tượng khác cùng loại.
public void doSomething(Car car)
{
car.run();
car.stop();
}
public void doSomething(Vehicle vehicle)
{
vehicle.run();
vehicle.stop();
}
Trong hai đoạn chương trình trên, đoạn chương trình thứ hai vẫn làm việc tốt khi chúng ta thêm vào các đối tượng khác cùng loại với “Car” mà kế thừa từ “Vehicle”.
Ý nghĩa
Nguyên lý Nghịch đảo phụ thuộc có mối liên hệ mật thiết với nguyên lý Open-Closed và là một trong bốn nguyên lý cơ bản làm nền tảng cho phân tích thiết kế hướng đối tượng. Nó giúp cho phần mềm có tính tái sử dụng cao, linh động và bền vững (robustness) trước những sự thay đổi.
Nguyên lý Thay thế Liskov
(The Liskov Substitution Principle)
Phát biểu
Lớp B chỉ nên kế thừa từ lớp A khi và chỉ khi với mọi hàm F thao tác trên các đối tượng của A, cách cư xử (behaviors) của F không thay đổi khi ta thay thế (substitute) các đối tượng của A bằng các đối tượng của B.
Nội dung
Kế thừa (inheritance) là một trong những tính chất cơ bản của lập trình hướng đối tượng. Đó là khả năng định nghĩa một lớp đối tượng dựa trên các lớp đối tượng đã được định nghĩa trước đó. Các đối tượng của lớp kế thừa có khả năng cư xử (behave) như các đối tượng của lớp cơ sở. Điều này có nghĩa là các đối tượng của lớp kế thừa hoàn toàn có thể thay thế các đối tượng của lớp cơ sở trong những hàm thao tác trên các đối tượng của lớp cơ sở.
Chính vì tính chất này mà chúng ta không thể sử dụng kế thừa một cách tùy tiện. Giả sử ta có lớp A và hàm F thao tác trên các đối tượng của A. Để nâng cấp, mở rộng phần mềm, ta cần thêm vào lớp B kế thừa từ A. Nhưng việc thay thế các đối tượng của A bằng các đối tượng của B lại làm cho F cư xử sai lệch so với trước khi thực hiện việc thay thế. Lúc này, để F có thể cư xử không đổi so với trước, ta phải chỉnh sửa lại F. Điều này làm cho F vi phạm nguyên lý Open-Closed.
Đoạn chương trình sau cho thấy việc kế thừa tùy tiện chỉ với mục đích tái sử dụng nguy hiểm như thế nào.
public class Stack
{
private ArrayList data;
// More data members of stack.
public virtual void push(int n)
{
// Pushes n to stack...
}
public virtual int pop()
{
// Pops value from stack...
}
}
public class Queue: Stack
{
// Data members of Queue.
public override void push(int n)
{
// Pushes n to queue...
}
public override int pop()
{
// Pops value from queue...
}
}
public int func(Stack p)
{
p.push(5);
p.push(6);
p.push(7);
int a = p.pop();
int b = p.pop();
if (a == 7 && b == 6)
return a * b;
throw new ArgumentException();
}
Với mục đích tái sử dụng là một số thuộc tính và phương thức trong “Stack”, chúng ta cho “Queue” kế thừa từ Stack. Xét hàm “func” thao tác trên đối tượng của “Stack”, do “Queue” kế thừa từ “Stack” nên chúng ta hoàn toàn có thể truyền đối tượng của “Queue” vào hàm này. Nhưng cách cư xử của hàm “func” khi thao tác trên các đối tượng của “Stack” và “Queue” là khác nhau. Với các đối tượng của “Stack” hàm func luôn trả về chính xác tích của hai số 7 và 6. Nhưng với các đối tượng của “Queue” hàm func lại luôn gây ra một exception. Để hàm “func” có thể cư xử trên các đối tượng của “Stack” và “Queue” như nhau, chúng ta phải viết lại nó. Điều này làm cho hàm “func” vi phạm nguyên lý Open-Closed. Khi đó ta nói hàm “func” vi phạm nguyên lý Thay thế Liskov.
Chú ý
i) Nguyên lý Thay thế Liskov có mối liên hệ mật thiết với Nguyên lý Open-Closed. Sự vi phạm nguyên lý Thay thế Liskov sẽ dẫn đến sự vi phạm nguyên lý Open-Closed. Một thực thể phần mềm vi phạm nguyên lý Thay thế Liskov sẽ cư xử khác nhau trên các đối tượng của lớp cơ sở và lớp kế thừa. Để thực thể phần mềm này vẫn có thể làm việc tốt trên các đối tượng của cả lớp cơ sở và lớp kế thừa, chúng ta phải chỉnh sửa lại nó. Điều này dẫn đến vi phạm nguyên lý Open-Closed.
ii) Không phải lúc nào tất cả các thực thể trong phần mềm đều có thể tuân thủ nguyên lý Thay thế Liskov. Nhưng mục tiêu của phân tích thiết kế hướng đối tượng là phải làm sao cho số lượng các thực thể tuân thủ nguyên lý là lớn nhất, trong đó ưu tiên các thực thể thường xuyên phải nâng cấp, mở rộng thỏa nguyên lý.
iii) Việc tuân thủ nguyên lý Thay thế Liskov của một thực thể phần mềm chỉ mang tính tương đối, phụ thuộc vào ngữ cảnh. Có thể trong ngữ cảnh này, thực thể thỏa nguyên lý, nhưng trong một ngữ cảnh khác, thực thể này không còn tuân thủ nguyên lý nữa. Mục tiêu của phân tích thiết kế hướng đối tượng là phải làm sao cho có nhiều thực thể phần mềm nhất tuân thủ nguyên lý trong ngữ cảnh thường xảy ra nhất của phần mềm, trong đó ưu tiên các thực thể thường xuyên phải nâng cấp, mở rộng thỏa nguyên lý.
iv) Quan hệ “IS-A” thường được dùng để phát hiện kế thừa. Khi lớp đối tượng B về mặt ngữ nghĩa là một trường hợp đặc biệt của lớp đối tượng A thì ta có thể cho B kế thừa từ A. Nhưng thực tế cho thấy, trong một số ngữ cảnh của phần mềm, một lớp đối tượng có quan hệ “IS-A” với những lớp đối tượng khác nhưng việc để nó kế thừa những lớp đối tượng này sẽ dẫn đến việc vi phạm nguyên lý Thay thế Liskov.
Xét đoạn chương trình sau.
public class Rectangle
{
// Data members of rectangle...
// Member functions of rectangle...
}
public class Square: Rectangle
{
// Data members of square...
// Member functions of square...
}
public double doSomething(Rectangle obj)
{
obj.setWidth(5);
obj.setHeight(6);
if (obj.Area == 30)
return obj.Area;
throw new ArgumentException();
}
Ở đoạn chương trình trên, mặc dù về mặt ngữ nghĩa, hình vuông là một trường hợp của hình chữ nhật. Điều này hoàn toàn đúng!!! Nhưng trong ngữ cảnh này, việc để “Square” kế thừa “Rectangle” là không phù hợp. Lúc này hàm “doSomething” cư xử khác nhau trên các đối tượng của “Rectangle” và “Square”. Như vậy hàm “doSomething” đã vi phạm nguyên lý Thay thế Liskov. Để hàm “doSomething” có thể làm việc được trên cả “Rectangle” và “Square” chúng ta phải chỉnh sửa lại nó. Như vậy việc vi phạm nguyên lý Thay thế Liskov đã làm cho hàm “doSomething” vi phạm nguyên lý Open-Closed.
v) Nguyên lý Thay thế Liskov có mối liên hệ mật thiết với kỹ thuật “Design by Contract” được đề cập bởi Bertrand Meyers. Kỹ thuật này chỉ ra rằng: mỗi phương thức trong một lớp đối tượng, khi được định nghĩa, đã hàm chứa trong nó tiền điều kiện (pre-condition) và hậu điều kiện (post-condition). Tiền điều kiện là những điều kiện cần để phương thức có thể thực hiện được. Hậu điều kiện là những ràng buộc phát sinh sau khi thực hiện phương thức. Khi thực hiện việc kế thừa, phương thức được định nghĩa lại trong lớp kế thừa phải có tiền điều kiện lỏng lẻo hơn (weaker) và hậu điều kiện chặt chẽ hơn (stronger). Điều này có nghĩa là trước khi thực hiện, phương thức được định nghĩa lại trong lớp kế thừa không được đòi hỏi nhiều hơn như khi nó được định nghĩa trong lớp cơ sở. Và sau khi thực hiện, phương thức được định nghĩa lại trong lớp kế thừa phải đảm bảo tất cả những ràng buộc phát sinh như khi nó được định nghĩa trong lớp cơ sở. Chỉ khi nào những điều trên được đáp ứng cho mọi phương thức trong lớp kế thừa thì lớp kế thừa mới được xem là cư xử như lớp cơ sở. Và khi đó, việc để nó kế thừa từ lớp cơ sở mới là đúng đắn trong ngữ cảnh phần mềm đang xét.
vi) Nguyên lý Thay thế Liskov và kỹ thuật “Design by Contract” vô tình làm cho việc kế thừa trở nên rất khó thực hiện. Khi cần thêm vào một lớp kế thừa, chúng ta phải xem xét rất kỹ lưỡng lại tất cả hàm có thao tác trên lớp cơ sở xem chúng có vi phạm nguyên lý Thay thế Liskov hay không. Chúng ta cũng cần phải xem xét tất cả các phương thức của lớp kế thừa xem chúng có vi phạm những quy định của kỹ thuật “Design by Contract” hay không. Tất cả những điều này là do lớp kế thừa có một mối liên hệ mật thiết với lớp cơ sở. Lớp kế thừa bị kết dính (coupling) chặt chẽ với lớp cơ sở. Sự kết dính này rõ ràng làm cho phần mềm kém linh động (flexibility) một khi có sự thay đổi xảy ra. Do đó, để hạn chế sự kết dính này mà vẫn đảm bảo được tính tái sử dụng, chúng ta chỉ nên kế thừa interface và sử dụng composition thay cho việc kế thừa.
Ý nghĩa
Nguyên lý Thay thế Liskov có mối liên hệ mật thiết với nguyên lý Open-Closed và là một trong bốn nguyên lý cơ bản làm nền tảng cho phân tích thiết kế hướng đối tượng. Nó giúp nâng cao tính tái sử dụng và bền vững của phần mềm trước những sự thay đổi.
Nguyên lý Phân tách interface
(The Interface Segregation)
Phát biểu
Không nên buộc các thực thể phần mềm phụ thuộc vào những interface mà chúng không sử dụng đến.
Nội dung
Khi xây dựng một lớp đối tượng, đặc biệt là những lớp trừu tượng (abstract class), nhiều người thường có xu hướng để cho lớp đối tượng thực hiện càng nghiều chức năng càng tốt, đưa thật nhiều thuộc tính và phương thức vào lớp đối tượng đó. Những lớp đối tượng như vậy được gọi là những lớp đối tượng có interface bị “ô nhiễm” (fat interface or polluted interface).
Khi một lớp đối tượng có interface bị “ô nhiễm”, nó sẽ trở nên cồng kềnh. Một thực thể phần mềm nào đó chỉ cần thực hiện một công việc đơn giản mà lớp đối tượng này hỗ trợ buộc phải làm việc với toàn bộ interface của lớp đối tượng đó. Việc phải truyền đi truyền lại nhiều lần những đối tượng có interface bị “ô nhiễm” sẽ làm giảm hiệu năng của phần mềm.
Đặc biệt đối với lớp trừu tượng có interface bị “ô nhiễm”, một số lớp kế thừa chỉ quan tâm đến một phần interface của lớp cơ sở nhưng bị buộc phải thực hiện việc cài đặt cho cả phần interface không hề có ý nghĩa đối với chúng. Điều này dẫn đến sự dư thừa không cần thiết trong các thực thể phần mềm. Quan trọng hơn nữa, việc buộc các lớp kế thừa phụ thuộc vào phần interface mà chúng không sử dụng đến sẽ làm tăng sự kết dính (coupling) giữa các thực thể phần mềm. Một khi sự nâng cấp, mở rộng diễn ra, đòi hỏi phần interface đó phải thay đổi, các lớp kế thừa này bị buộc phải chỉnh sửa theo. Điều này làm cho chúng vi phạm nguyên lý Open-Closed.
Hình bên dươi là sơ đồ lớp cho đoạn chương trình tính điện trở mạch điện. “Resistor” và “Lamp” là những mạch điện đơn giản với điện trở là một thuộc tính của mạch. Trong khi “SeriesCircuit” và “ParallelCircuit” là những mạch điện phức hợp với điện trở của mạch được tính từ các mạch điện con. Để có thể cư xử như nhau trên các loại mạch điện này hay nói cách khác là truy xuất đến chúng một cách “trong suốt” (transparency), chúng ta có “Circuit” là lớp trừu tượng chung đại diện cho các mạch điện khác nhau.
Lớp “Circuit” được thiết kế như trên được gọi là có interface bị “ô nhiễm”. “Resistor” và “Lamp” bị buộc phải thực hiện việc cài đặt cho các phương thức “add” và “remove” hoàn toàn chẳng có ý nghĩa gì với chúng. Điều này gây ra sự dư thừa code không cần thiết cũng như gây “khó chịu” cho những thực thể phần mềm khác sử dụng “Resistor” và “Lamp”.
Nhưng vấn đề chỉ thật sự xảy ra khi chúng ta nâng cấp, mở rộng đoạn chương trình trên. Giả sử chúng ta cần thêm vào phương thức “removeAt” để hỗ trợ việc xóa mạch điện con tại vị trí nào đó trong mạch điện phức hợp. Lúc này, chúng ta phải thực hiện việc chỉnh sửa trên tất cả các lớp đối tượng kế thừa từ “Circuit”. Việc chỉnh sửa trên “SeriesCircuit” và “ParallelCircuit” xem ra còn có thể chấp nhận được. Nhưng việc phải chỉnh sửa trên “Resistor” và “Lamp” là không thể chấp nhận được vì phương thức “removeAt” chẳng hề có ý nghĩa gì đối với chúng. Điều này rõ ràng làm cho “Resistor” và “Lamp” vi phạm nguyên lý Open-Closed một cách “không chính đáng”.
Chú ý
i) Nguyên lý Phân tách interface có mối liên hệ với nguyên lý Open-Closed. Sự vi phạm nguyên lý Phân tách interface có khả năng dẫn đến sự vi phạm nguyên lý Open-Closed (xem phân tích ở trên).
ii) Để tránh vi phạm nguyên lý Phân tách Inteface, chúng ta nên giữ cho interface của lớp đối tượng đơn giản và gọn nhẹ, nên làm theo tiêu chí “a class should do one thing and do it well”. Chúng ta không nên để cho lớp đối tượng đảm nhận quá nhiều trách nhiệm vì điều này dễ làm cho interface của nó bị “ô nhiễm”.
iii) Interface bị “ô nhiễm” của lớp đối tượng nên được phân tách ngay khi có thể để tránh khả năng dẫn đến sự vi phạm nguyên lý Open-Closed. Việc phân tách interface bị “ô nhiễm” của một lớp cơ sở có thể được thực hiện thông qua việc tăng thêm mức độ trừu tượng trong cây kế thừa của nó. Lớp cơ sở ban đầu chỉ nên có interface đơn giản mà mọi lớp kế thừa của nó đều cần phải có. Sau đó, phần interface chung của một bộ phận lớp kế thừa được tổng hợp lại trong một lớp cơ sở. Và lớp cơ sở này lại kế thừa từ lớp cơ sở ban đầu. Như vậy những lớp kế thừa thuộc nhánh khác không bị phụ thuộc vào phần interface mà chúng không sử dụng đến của bộ phận lớp kế thừa kia.
Với trường hợp đoạn chương trình tính điện trở mạch điện, để giải quyết vấn đề interface của “Circuit” bị “ô nhiễm”, chúng ta tăng thêm một mức độ trừu tượng trong cây kế thừa của nó. Khi đó, “Circuit” đóng vai trò là lớp trừu tượng cho các mạch điện khác nhau. Nó chỉ chứa phần interface chung nhất của tất cả các mạch điện này. Và trong ngữ cảnh bài toán tính điện trở đơn giản thì nó chỉ chứa phương thức “calcResistance”.
Chúng ta sẽ có lớp “SingleCircuit” đại diện cho các mạch điện đơn giản và “ComplexCircuit” đại diện cho cách mạch điện phức hợp. “SingleCircuit” chứa phần interface chung của các mạch điện đơn giản như “Resistor” và “Lamp” trong khi “ComplexCircuit” chứa phần interface chung của các mạch điện phức hợp. Chúng ta sẽ có được cây kế thừa như hình bên dưới.
Lúc này, khi cần thêm vào phương thức “removeAt” chúng ta chỉ việc nâng cấp phần interface của “ComplexCircuit”, nhánh kế thừa bên “SingleCircuit” sẽ không bị ảnh hưởng.
iv) Trong một số trường hợp, sau khi phân tách interface, một số lớp kế thừa mới thêm vào muốn sử dụng những phần interface đã phân tách, chúng có thể thực hiện việc đa kế thừa từ những lớp đối tượng hỗ trợ những phần interface này hoặc cũng có thể kế thừa từ một lớp đối tượng hỗ trợ một phần interface chúng cần và thực hiện composition đối với những đối tượng hỗ trợ phần interface còn lại.
Ý nghĩa
Nguyên lý Phân tách interface có mối liên hệ với nguyên lý Open-Closed và là một trong bốn nguyên lý cơ bản làm nền tảng cho phân tích thiết kế hướng đối tượng. Nó giúp giảm sự cồng kềnh, dư thừa không cần thiết cho phần mềm và quan trọng hơn là giảm sự kết dính (copuling) làm hạn chế tính linh động (flexibility) của phần mềm.
Sưu tầm: http://www.ciren.gov.vn/forums/showthread.php?t=528
[LT Hướng Đối Tượng](/lthdt) > [LTHĐT_Hỗ trợ](/lthdt/lthdt_congcuhotro) >

Server: GSE

X-Content-Type-Options: nosniff

X-Frame-Options: SAMEORIGIN

X-Robots-Tag: noarchive

Cache-Control: public, max-age=5

X-XSS-Protection: 1; mode=block


text:
Đông Trùng Hạ Thảo Nông Lâm (50g) được nuôi trồng trên cơ chất nhọng dâu tằm, các cơ sở kinh doanh ở Việt Nam được gọi tên là Đông Trùng Hả Thảo, sản phẩm được sản xuất, nuôi trồng tại Việt Nam
2.900.000 ₫

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: text/html

Server: Apache

Connection: close

Referrer-Policy: same-origin

X-Robots-Tag: noindex

Cache-Control: no-cache, must-revalidate, max-age=0

Vary: Accept-Encoding

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


text:
CÔNG TY TNHH BẢO AN CONTAINER
baoancontainer@gmail.com
Bãi DDC Đoạn Xá 2 - P. Đông Hải 2 - Q.Hải An - TP.Hải Phòng

WARC-Identified-Payload-Type: application/xhtml+xml

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Vary: Accept-Encoding,User-Agent

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


text:
Toyota Yaris 2018 chốt giá bán và ngày ra mắt chính thức tại Việt Nam: Nếu hỏi lý do vì sao Yaris 2018 chiếm được sự tin tưởng và yêu thích của khách hàng, thì không thể không nhắc đến khoang hành khách rộng rãi lý tưởng với chiều dài cơ sở lên đến 2550mm, một con số nói lên sự thoải mái ở khoảng để chân giữa hai hàng ghế. Tuy nhiên, khoang hành lý của xe khá hạn chế với thể tích chỉ vào khoảng 300 lít. Thông tin chi tiết bạn đọc có thể theo dõi ở bài đánh giá xe Toyota Yaris 2018 ngay dưới đây!
Bảng giá xe Yaris 2018
Ra mắt hồi đầu năm tại triển lãm New York 2017, Yaris 2018 gây ấn tượng với thiết kế thể thao, sắc sảo và có phần hiện đại hơn. Cùng với đó, giá xe cũng tăng so với “người cũ” khi Toyota vừa chính thức công bố giá bán của mẫu xe này. Trong đó phiên bản tiêu chuẩn Yaris L có giá 15.635 USD, cao hơn 385 USD so với bản trước trong khi phiên bản LE có giá 16.910 USD. Yaris 5 cửa có giá từ 16.375 USD cũng tăng 385 USD so với phiên bản 2017.
Đáng chú ý, Yaris 2018 SE 5 cửa với động cơ thể thao và hộp số sàn dành cho các tín đồ tốc độ có giá mới 18.260 USD, tăng tới 1.060 USD. Nếu chọn số tự động cho phiên bản này, giá vẫn tăng 885 USD so với người tiền nhiệm với giá mới, 19.060 USD. Tuy nhiên, không chỉ thiết kế mới, giá tăng cũng đồng nghĩa với tăng trang bị. Dòng Yaris L và LE có thêm hệ thống âm thanh kèm màn hình cảm ứng 6,1 inch mới chạy hệ thống giải trí Infotaiment Entune của Toyota hỗ trợ kết nối Bluetooth và điều khiển bằng giọng nói. Riêng bản SE cao cấp nhất sở hữu màn hình cảm ứng 7 inch hơn hơn kèm hệ thống dẫn đường. Cập nhật giá xe Toyota ở đây: https://muasamxe.com/gia-xe-toyota/
Đánh giá xe Toyota Yaris 2018
Toyota Yaris 2018 sở hữu kích thước tổng thể 4115 x 1700 x 1475 mm, Yaris 2018 Hatchback 5 cửa có dáng xe dài và bề thế hơn so với những mẫu xe cùng phân khúc. Đặc điểm dễ nhận ra nhất của một chiếc Yaris 2018 hatchback nằm ở lưới tản nhiệt với thanh kim loại bản rộng được vuốt dài xuống hốc gió tạo thành hình thang cân rất nổi bật. Ngoài ra, cụm đèn trước dạng halogen vuốt mỏng sắc sảo và sống động cũng là điểm thu hút của Yaris 2018, mang đến cho xe nét tươi trẻ và thanh lịch hơn. Phiên bản cao cấp Yaris 1.5G được tích hợp thêm dải LED chiếu sáng ban ngày, giúp xe cá tính và hiện đại hơn. Hốc đèn sương mù bên dưới sơn cùng màu với hốc gió, tạo sự mạch lạc về thiết kế.
Hông xe Toyota Yaris 2018 được dập nhẹ những đường gờ nổi nhẹ nhàng, tay nắm cửa bản G được mạ bạc, trong khi đó, bộ lazang 8 chấu hình cánh quạt xé gió làm dáng xe thêm phần khỏe khoắn. Ngoài ra, gương chiếu hậu của các bản Yaris 2018 đều đã được nâng cấp hoàn toàn, hỗ trợ chỉnh gập điện, tích hợp báo rẽ và sơn cùng màu thân xe. Đuôi xe có điểm nhấn là cụm đèn hậu hình boomerang độc đáo, nẹp biển số trung tâm tạo hình đẹp mắt, cộng với cánh hướng gió trên cao và cột ăng ten mang đến cảm giác thể thao. Đặc biệt là xe có cả đèn sương mù hậu, giúp cho các phương tiện phía sau quan sát tốt hơn.
Nếu hỏi lý do vì sao Yaris 2018 chiếm được sự tin tưởng và yêu thích của khách hàng, thì không thể không nhắc đến khoang hành khách rộng rãi lý tưởng với chiều dài cơ sở lên đến 2550mm, một con số nói lên sự thoải mái ở khoảng để chân giữa hai hàng ghế. Tuy nhiên, khoang hành lý của xe khá hạn chế với thể tích chỉ vào khoảng 300 lít.
Đánh giá ưu nhược điểm xe Yaris 2018
Yaris 2018 5 cửa sở hữu một thiết kế thanh lịch với táp lô đối xứng và bảng điều khiển trung tâm dạng thác đổ được ốp bạc đẹp mắt. Xe sử dụng tone màu đen chủ đạo giúp các chi tiết như đèn báo điện tử màu cam và viền bạc nổi bật hơn, giúp không gian cá tính và sắc sảo, gây ấn tượng mạnh với hành khách. Tay lái Yaris được thiết kế 3 chấu, hỗ trợ chỉnh tay 2 hướng cầm lái thoải mái, riêng bản G được bọc da cao cấp và tích hợp nút bấm điều chỉnh âm thanh. Gương chiếu hậu trong xe hỗ trợ 2 chế độ ngày/ đêm. Cụm đồng hồ của bản G có thêm màn hình hiển thị đa thông tin, giúp người lái nắm thông số xe trực quan hơn.
Ghế ngồi đều được bọc chất liệu nỉ song Yaris G có chất lượng cao cấp hơn bản E một chút. Ghế lái hỗ trợ chỉnh tay 6 hướng còn ghế hành khách chỉnh tay 4 hướng do đó luôn có tư thế ngồi rất thoải mái. Hàng ghế phía sau của bản Yaris E chỉ có thể gập cả băng trong khi Yaris G cho phép gập 60:40 linh hoạt hơn. Hệ thống điều hòa của bản E vẫn là chỉnh tay cơ học, cùng với dàn CD 1 đĩa 4 loa làm trung tâm giải trí trong khi Yaris G hiện đại hơn với điều hòa tự động, dàn DVD 6 loa. Cả 2 đều có thể bật đài Radio, kết nối USB/AUX/Bluetooth tiện lợi. Yaris G được trang bị tính năng chìa khóa thông minh và khởi động bằng nút bấm, nâng tầm trải nghiệm cho chủ nhân. Ngoài ra, các cửa sổ đều có thể chỉnh điện 1 chạm, chống kẹt ở ghế lái. Cập nhật tin tức mua bán xe hơi ở đây!

markdown:
Toyota Yaris 2018 chốt giá bán và ngày ra mắt chính thức tại Việt Nam: Nếu hỏi lý do vì sao Yaris 2018 chiếm được sự tin tưởng và yêu thích của khách hàng, thì không thể không nhắc đến khoang hành khách rộng rãi lý tưởng với chiều dài cơ sở lên đến 2550mm, một con số nói lên sự thoải mái ở khoảng để chân giữa hai hàng ghế. Tuy nhiên, khoang hành lý của xe khá hạn chế với thể tích chỉ vào khoảng 300 lít. Thông tin chi tiết bạn đọc có thể theo dõi ở bài đánh giá xe Toyota Yaris 2018 ngay dưới đây!
## Bảng
[giá xe Yaris 2018](https://muasamxe.com/gia-xe-toyota-yaris/)
Ra mắt hồi đầu năm tại triển lãm New York 2017, Yaris 2018 gây ấn tượng với thiết kế thể thao, sắc sảo và có phần hiện đại hơn. Cùng với đó, giá xe cũng tăng so với “người cũ” khi Toyota vừa chính thức công bố giá bán của mẫu xe này. Trong đó phiên bản tiêu chuẩn Yaris L có giá 15.635 USD, cao hơn 385 USD so với bản trước trong khi phiên bản LE có giá 16.910 USD. Yaris 5 cửa có giá từ 16.375 USD cũng tăng 385 USD so với phiên bản 2017.
Đáng chú ý, Yaris 2018 SE 5 cửa với động cơ thể thao và hộp số sàn dành cho các tín đồ tốc độ có giá mới 18.260 USD, tăng tới 1.060 USD. Nếu chọn số tự động cho phiên bản này, giá vẫn tăng 885 USD so với người tiền nhiệm với giá mới, 19.060 USD. Tuy nhiên, không chỉ thiết kế mới, giá tăng cũng đồng nghĩa với tăng trang bị. Dòng Yaris L và LE có thêm hệ thống âm thanh kèm màn hình cảm ứng 6,1 inch mới chạy hệ thống giải trí Infotaiment Entune của Toyota hỗ trợ kết nối Bluetooth và điều khiển bằng giọng nói. Riêng bản SE cao cấp nhất sở hữu màn hình cảm ứng 7 inch hơn hơn kèm hệ thống dẫn đường. Cập nhật giá xe Toyota ở đây:
[https://muasamxe.com/gia-xe-toyota/](https://muasamxe.com/gia-xe-toyota/)
## Đánh giá xe Toyota Yaris 2018
Toyota Yaris 2018 sở hữu kích thước tổng thể 4115 x 1700 x 1475 mm, Yaris 2018 Hatchback 5 cửa có dáng xe dài và bề thế hơn so với những mẫu xe cùng phân khúc. Đặc điểm dễ nhận ra nhất của một chiếc Yaris 2018 hatchback nằm ở lưới tản nhiệt với thanh kim loại bản rộng được vuốt dài xuống hốc gió tạo thành hình thang cân rất nổi bật. Ngoài ra, cụm đèn trước dạng halogen vuốt mỏng sắc sảo và sống động cũng là điểm thu hút của Yaris 2018, mang đến cho xe nét tươi trẻ và thanh lịch hơn. Phiên bản cao cấp Yaris 1.5G được tích hợp thêm dải LED chiếu sáng ban ngày, giúp xe cá tính và hiện đại hơn. Hốc đèn sương mù bên dưới sơn cùng màu với hốc gió, tạo sự mạch lạc về thiết kế.
Hông xe Toyota Yaris 2018 được dập nhẹ những đường gờ nổi nhẹ nhàng, tay nắm cửa bản G được mạ bạc, trong khi đó, bộ lazang 8 chấu hình cánh quạt xé gió làm dáng xe thêm phần khỏe khoắn. Ngoài ra, gương chiếu hậu của các bản Yaris 2018 đều đã được nâng cấp hoàn toàn, hỗ trợ chỉnh gập điện, tích hợp báo rẽ và sơn cùng màu thân xe. Đuôi xe có điểm nhấn là cụm đèn hậu hình boomerang độc đáo, nẹp biển số trung tâm tạo hình đẹp mắt, cộng với cánh hướng gió trên cao và cột ăng ten mang đến cảm giác thể thao. Đặc biệt là xe có cả đèn sương mù hậu, giúp cho các phương tiện phía sau quan sát tốt hơn.
Nếu hỏi lý do vì sao Yaris 2018 chiếm được sự tin tưởng và yêu thích của khách hàng, thì không thể không nhắc đến khoang hành khách rộng rãi lý tưởng với chiều dài cơ sở lên đến 2550mm, một con số nói lên sự thoải mái ở khoảng để chân giữa hai hàng ghế. Tuy nhiên, khoang hành lý của xe khá hạn chế với thể tích chỉ vào khoảng 300 lít.
## Đánh giá
[ưu nhược điểm xe Yaris 2018](https://muasamxe.com/toyota-yaris-2018/)
Yaris 2018 5 cửa sở hữu một thiết kế thanh lịch với táp lô đối xứng và bảng điều khiển trung tâm dạng thác đổ được ốp bạc đẹp mắt. Xe sử dụng tone màu đen chủ đạo giúp các chi tiết như đèn báo điện tử màu cam và viền bạc nổi bật hơn, giúp không gian cá tính và sắc sảo, gây ấn tượng mạnh với hành khách. Tay lái Yaris được thiết kế 3 chấu, hỗ trợ chỉnh tay 2 hướng cầm lái thoải mái, riêng bản G được bọc da cao cấp và tích hợp nút bấm điều chỉnh âm thanh. Gương chiếu hậu trong xe hỗ trợ 2 chế độ ngày/ đêm. Cụm đồng hồ của bản G có thêm màn hình hiển thị đa thông tin, giúp người lái nắm thông số xe trực quan hơn.
Ghế ngồi đều được bọc chất liệu nỉ song Yaris G có chất lượng cao cấp hơn bản E một chút. Ghế lái hỗ trợ chỉnh tay 6 hướng còn ghế hành khách chỉnh tay 4 hướng do đó luôn có tư thế ngồi rất thoải mái. Hàng ghế phía sau của bản Yaris E chỉ có thể gập cả băng trong khi Yaris G cho phép gập 60:40 linh hoạt hơn. Hệ thống điều hòa của bản E vẫn là chỉnh tay cơ học, cùng với dàn CD 1 đĩa 4 loa làm trung tâm giải trí trong khi Yaris G hiện đại hơn với điều hòa tự động, dàn DVD 6 loa. Cả 2 đều có thể bật đài Radio, kết nối USB/AUX/Bluetooth tiện lợi. Yaris G được trang bị tính năng chìa khóa thông minh và khởi động bằng nút bấm, nâng tầm trải nghiệm cho chủ nhân. Ngoài ra, các cửa sổ đều có thể chỉnh điện 1 chạm, chống kẹt ở ghế lái. Cập nhật
[tin tức mua bán xe hơi](https://muasamxe.com/mua-ban-oto/) ở đây!

WARC-Truncated: length

Server: nginx

Vary: Cookie


text:
DANH MỤC SẢN PHẨM
Găng tay bảo hộ lao động
Đồng phục bảo hộ lao động
SẢN PHẨM BÁN CHẠY
-
Găng tay hạt nhựa 3-500x500 80g
-
Băng keo điện
-
Găng tay phủ hạt nhựa sợi puli trắng
-
Găng tay phủ hạt nhựa sợi len
-
Nút tai chống ồn 3M-1100
-
Găng tay sợi len màu kem
-
Băng keo hai mặt
-
Găng tay sợi poli
-
găng tay len nhúng cao su màu đỏ
-
Cuộn rào công trình VL2
-
Băng keo màu
-
Nút tai chống ồn lNP353
-
Găng tay chống tĩnh điện phủ ngón màu xám
-
Găng tay chống tĩnh điện hở ngón
-
Màng PE
-
Nón PROTECTOR HC43/HC53
-
Găng tay chống nhiệt Temp-Sea 725
-
Găng tay chống nhiệt Temp-Sea 770
-
khẩu trang than nhoạt tính GP
-
Khẩu trang Neomask VC65 quàng sau gáy
-
Găng tay chống hóa chất Ultranitril 492
-
khẩu trang 3 lớp VL2
-
Vòi chữa cháy công nghệ Đức(xuất xứ trung quốc)
-
Nón phòng sạch con sâu
-
Găng tay phủ PU lòng bàn tay màu trắng
-
Vòi chữa cháy Đức sản xuất
-
Khẩu trang KT5 Mũi thép ngoài
-
Đồng phục công nhân VL17
-
Giày da bảo hộ Dragon 1NR
-
Mặt nạ phòng độc 3M 7501-7502
-
Mặt nạ lọc độc 3M-6800
-
Giày vải phòng sạch XP
-
Giày King KWS800
-
KING'S KWS803
-
Giày K2
-
giày BHLĐ MARUGO AX-013
-
Áo phản quang VL2
-
Áo phản quang VL4
SẢN PHẨM MỚI
-
Giày K2
-
Giày vải phòng sạch XP
-
Quần áo CN VL21 đủ màu, đủ size, tùy chất liệu
-
Khẩu trang KT5 lá mũi thép ngoài
-
Đồng phục công nhân VL17
-
Đồng phục công nhân đơn giản VL16
-
Nón North A69, A79
-
Găng tay thun phủ PU đầu ngón
-
khẩu trang 3 lớp VL1
-
Găng tay chống nhiệt Temp-Sea 770
-
Giầy DH-group 01
-
Găng tay Junk Yard Dog
-
Găng tay chống tĩnh điện hở ngón
-
Găng tay nhúng cao su màu vàng
-
Găng tay sợi poli
-
Giày bảo hộ lao động XP xanh (XP 1206)
-
Thang dây thoát hiểm cuốn VL1
-
Găng tay phủ hạt nhựa sợi puli trắng
-
Găng tay phủ hạt nhựa sợi puly đen
Quần áo DUPONT 2
- Quần áo DUPONT 2
- Giá bán: Liên hệ
- Lượt xem: 2441 lượt
Sản phẩm cùng loại
Giới Thiệu Về Công Ty
Công Ty TNHH Bảo Hộ Lao Động Việt Linh chúng tôi tự hào là một trong những đơn vị uy tín trong lĩnh vực Bảo Hộ Lao Động - phục vụ an toàn cho con người trong lao động sản xuất, chúng tôi tự tin khi đưa ra giải pháp, tư vấn về giá cả....Xem Thêm
TIN TỨC NỔI BẬTNhững loại đồng phục bảo hộ lao động cơ bản
Mỗi loại đồng phục bảo hộ lao động có cách thiết kế và phối hợp chất vải khác nhau để mang lại hiệu quả bảo vệ tốt nhất cho người lao động. Chúng ta cần có cách phân biệt rõ ràng để lựa chọn đúng cho ngành nghề của mình đang hoạt động.

markdown:
DANH MỤC SẢN PHẨM
[Găng tay bảo hộ lao động](product/32/gang-tay-bao-ho-lao-dong) [Đồng phục bảo hộ lao động](product/37/dong-phuc-bao-ho-lao-dong)
SẢN PHẨM BÁN CHẠY
-
Găng tay hạt nhựa 3-500x500 80g
-
Băng keo điện
-
Găng tay phủ hạt nhựa sợi puli trắng
-
Găng tay phủ hạt nhựa sợi len
-
Nút tai chống ồn 3M-1100
-
Găng tay sợi len màu kem
-
Băng keo hai mặt
-
Găng tay sợi poli
-
găng tay len nhúng cao su màu đỏ
-
Cuộn rào công trình VL2
-
Băng keo màu
-
Nút tai chống ồn lNP353
-
Găng tay chống tĩnh điện phủ ngón màu xám
-
Găng tay chống tĩnh điện hở ngón
-
Màng PE
-
Nón PROTECTOR HC43/HC53
-
Găng tay chống nhiệt Temp-Sea 725
-
Găng tay chống nhiệt Temp-Sea 770
-
khẩu trang than nhoạt tính GP
-
Khẩu trang Neomask VC65 quàng sau gáy
-
Găng tay chống hóa chất Ultranitril 492
-
khẩu trang 3 lớp VL2
-
Vòi chữa cháy công nghệ Đức(xuất xứ trung quốc)
-
Nón phòng sạch con sâu
-
Găng tay phủ PU lòng bàn tay màu trắng
-
Vòi chữa cháy Đức sản xuất
-
Khẩu trang KT5 Mũi thép ngoài
-
Đồng phục công nhân VL17
-
Giày da bảo hộ Dragon 1NR
-
Mặt nạ phòng độc 3M 7501-7502
-
Mặt nạ lọc độc 3M-6800
-
Giày vải phòng sạch XP
-
Giày King KWS800
-
KING'S KWS803
-
Giày K2
-
giày BHLĐ MARUGO AX-013
-
Áo phản quang VL2
-
Áo phản quang VL4
SẢN PHẨM MỚI
-
Giày K2
-
Giày vải phòng sạch XP
-
Quần áo CN VL21 đủ màu, đủ size, tùy chất liệu
-
Khẩu trang KT5 lá mũi thép ngoài
-
Đồng phục công nhân VL17
-
Đồng phục công nhân đơn giản VL16
-
Nón North A69, A79
-
Găng tay thun phủ PU đầu ngón
-
khẩu trang 3 lớp VL1
-
Găng tay chống nhiệt Temp-Sea 770
-
Giầy DH-group 01
-
Găng tay Junk Yard Dog
-
Găng tay chống tĩnh điện hở ngón
-
Găng tay nhúng cao su màu vàng
-
Găng tay sợi poli
-
Giày bảo hộ lao động XP xanh (XP 1206)
-
Thang dây thoát hiểm cuốn VL1
-
Găng tay phủ hạt nhựa sợi puli trắng
-
Găng tay phủ hạt nhựa sợi puly đen
Quần áo DUPONT 2
[Quần áo DUPONT 2] **Giá bán:**Liên hệ **Lượt xem:**2441 lượt
Sản phẩm cùng loại
[Giới Thiệu Về Công Ty](about/1/gioi-thieu-ve-cong-ty.html) [](about/1/gioi-thieu-ve-cong-ty.html)
![](upload/news/sp11.png)
Công Ty TNHH Bảo Hộ Lao Động Việt Linh chúng tôi tự hào là một trong những đơn vị uy tín trong lĩnh vực Bảo Hộ Lao Động - phục vụ an toàn cho con người trong lao động sản xuất, chúng tôi tự tin khi đưa ra giải pháp, tư vấn về giá cả....
[Xem Thêm](about.html)
#### TIN TỨC NỔI BẬT
[](tin-tuc/37/nhung-loai-dong-phuc-bao-ho-lao-dong-co-ban.html)
Những loại đồng phục bảo hộ lao động cơ bản
![](upload/news/phuong-tien-bao-ho-lao-dong-rat-can-thiet-trong-lao-dong.jpg)
Mỗi loại đồng phục bảo hộ lao động có cách thiết kế và phối hợp chất vải khác nhau để mang lại hiệu quả bảo vệ tốt nhất cho người lao động. Chúng ta cần có cách phân biệt rõ ràng để lựa chọn đúng cho ngành nghề của mình đang hoạt động.

Content-Type: text/html


text:
Bò cuộn Wellington là một món ăn cao cấp rất được ưa chuộng ở các nước Châu Âu. Tên Wellington được đặt theo vị anh hùng từng đánh bại hoàng đế Napoleon ở mặt trận Waterloo năm 1815, ngài Arthur Wellesley có tên thường gọi là Duke hoặc Wellington. Ông Arthur Wellesley rất thích thịt bò và nấm nên đã yêu cầu đầu bếp làm ra món bò cuộn này để thưởng thức. Từ đó, món bò cuộn được lấy tên là Wellington cho đến ngày nay.
Ngay từ khi mới ra đời, bò cuộn Wellington cũng đã xuất hiện thường xuyên trong các bữa tiệc của gia đình quý tộc. Và cho đến nay, bởi được sử dụng nguyên liệu hảo hạng, cách chế biến cầu kỳ tỉ mỉ nên món ăn này vẫn được xếp vào tầng lớp các món ăn cao cấp bật nhất ở Châu Âu.
Bò cuộn Wellington gồm 3 phần quan trọng như phần lõi thịt bò, lớp nấm, phần vỏ pastry. Mỗi phần đều phải được trải qua công đoạn chế biến hết sức công phu để món ăn ngon vị từ trong ra ngoài.
Phần lõi của món bò cuộn Wellington chính là thịt bò. Tuy nhiên, không phải là sử dụng bất kỳ phần thịt nào của con bò cũng được mà phần thịt bò ở đây phải sử dụng thịt bò thăn. Phần thịt thăn bò có hàm lượng thịt nạc và mỡ hài hòa, không quá béo mà cũng không quá khô nên được xem là lựa chọn tuyệt vời để làm món bò Wellington. Thịt bò sau khi được ướp gia vị với muối và tiêu sẽ được gói lại thành một cuộn dài rồi áp chảo cho chín đều các mặt.
Lớp thứ hai của món bò Wellington chính là hỗn hợp của nấm hương băm nhỏ xào chín cùng với hành, tỏi và gia vị. Ngoài nấm hương thì đôi khi người ta còn sử dụng thêm pate gan ngỗng để tăng độ béo cho món ăn.
Để dễ cuộn nấm hương vào thì người ta lót thêm một lớp thịt thái thật mỏng bên dưới rồi cho hết nấm hương vừa xào và tán đều lên trên. Sau cùng thì cho lõi thịt bò thăn áp chảo đã được phết thêm mù tạt vàng bên ngoài lên rồi gói lại cho thật chặt.
Lớp cuối cùng của món bò Wellington chính là phần bột ngàn lớp pastry. Gọi là bột ngàn lớp vì phần bột này sau khi nướng chín sẽ tách ra khá nhiều lớp khiến bánh không chỉ phồng lên đẹp mắt mà còn xốp mềm rất ngon miệng. Để làm được phần bột ngàn lớp này đòi hỏi các đầu bếp phải có rất nhiều kinh nghiệm lẫn khéo léo trong quá trình nhào nặn và ủ bột. Đặc biệt, phần bột này cũng được trộn chung với bơ nên sau khi nướng bánh xong thì mùi bơ dậy lên thơm ngon rất khó cưỡng.
Sau khi gói xong phần nhân vào bột thì người ta còn trang trí cho lớp bột bên ngoài trông đẹp mắt hơn. Phần trang trí này không bắt buộc và khá đơn giản. Ví dụ như dùng một chiếc dĩa cào vài đường trên bánh để tạo ra các sọc lạ mắt hoặc dùng những sợi bột đặt lên giúp vỏ bánh có đường gân nổi bật hơn. Cuối cùng là người làm bánh sẽ phết 1 lớp lòng đỏ trứng gà lên lớp bột và cho vào lò nướng là xong.
Điểm lưu ý của món bánh Wellington "quý tộc" này là người thợ khi thực hiện cuộn các lớp nguyên liệu phải dùng lực và thật chặt tay để các lớp nguyên liệu dính chặt vào nhau đến mức không có một khe hở nào thì sau khi hoàn thành và cắt bánh ra, món bánh mới hoàn hảo được.
Như vậy, có lẽ không cần biết qua các công đoạn chế biến cầu kỳ cũng như các nguyên liệu cao cấp mà chỉ cần nhìn các lát cắt của bò cuộn Wellington là bạn đủ cảm nhận đây là món ăn không phải "dạng tầm thường". Khi nếm thử món ăn, bạn sẽ cảm nhận ngay độ giòn hoàn hảo của vỏ bánh, độ thơm ngon và ngọt của lớp nấm cùng với thịt bò mềm như tan chảy trong miệng, chắc chắn nếu có cơ hội ăn thử một lần sẽ vô cùng thích thú.
Nguồn: Tasty

markdown:
Bò cuộn Wellington là một món ăn cao cấp rất được ưa chuộng ở các nước Châu Âu. Tên Wellington được đặt theo vị anh hùng từng đánh bại hoàng đế Napoleon ở mặt trận Waterloo năm 1815, ngài Arthur Wellesley có tên thường gọi là Duke hoặc Wellington. Ông Arthur Wellesley rất thích thịt bò và nấm nên đã yêu cầu đầu bếp làm ra món bò cuộn này để thưởng thức. Từ đó, món bò cuộn được lấy tên là Wellington cho đến ngày nay.
Ngay từ khi mới ra đời, bò cuộn Wellington cũng đã xuất hiện thường xuyên trong các bữa tiệc của gia đình quý tộc. Và cho đến nay, bởi được sử dụng nguyên liệu hảo hạng, cách chế biến cầu kỳ tỉ mỉ nên món ăn này vẫn được xếp vào tầng lớp các món ăn cao cấp bật nhất ở Châu Âu.
Bò cuộn Wellington gồm 3 phần quan trọng như phần lõi thịt bò, lớp nấm, phần vỏ pastry. Mỗi phần đều phải được trải qua công đoạn chế biến hết sức công phu để món ăn ngon vị từ trong ra ngoài.
Phần lõi của món bò cuộn Wellington chính là thịt bò. Tuy nhiên, không phải là sử dụng bất kỳ phần thịt nào của con bò cũng được mà phần thịt bò ở đây phải sử dụng thịt bò thăn. Phần thịt thăn bò có hàm lượng thịt nạc và mỡ hài hòa, không quá béo mà cũng không quá khô nên được xem là lựa chọn tuyệt vời để làm món bò Wellington. Thịt bò sau khi được ướp gia vị với muối và tiêu sẽ được gói lại thành một cuộn dài rồi áp chảo cho chín đều các mặt.
Lớp thứ hai của món bò Wellington chính là hỗn hợp của nấm hương băm nhỏ xào chín cùng với hành, tỏi và gia vị. Ngoài nấm hương thì đôi khi người ta còn sử dụng thêm pate gan ngỗng để tăng độ béo cho món ăn.
Để dễ cuộn nấm hương vào thì người ta lót thêm một lớp thịt thái thật mỏng bên dưới rồi cho hết nấm hương vừa xào và tán đều lên trên. Sau cùng thì cho lõi thịt bò thăn áp chảo đã được phết thêm mù tạt vàng bên ngoài lên rồi gói lại cho thật chặt.
Lớp cuối cùng của món bò Wellington chính là phần bột ngàn lớp pastry. Gọi là bột ngàn lớp vì phần bột này sau khi nướng chín sẽ tách ra khá nhiều lớp khiến bánh không chỉ phồng lên đẹp mắt mà còn xốp mềm rất ngon miệng. Để làm được phần bột ngàn lớp này đòi hỏi các đầu bếp phải có rất nhiều kinh nghiệm lẫn khéo léo trong quá trình nhào nặn và ủ bột. Đặc biệt, phần bột này cũng được trộn chung với bơ nên sau khi nướng bánh xong thì mùi bơ dậy lên thơm ngon rất khó cưỡng.
Sau khi gói xong phần nhân vào bột thì người ta còn trang trí cho lớp bột bên ngoài trông đẹp mắt hơn. Phần trang trí này không bắt buộc và khá đơn giản. Ví dụ như dùng một chiếc dĩa cào vài đường trên bánh để tạo ra các sọc lạ mắt hoặc dùng những sợi bột đặt lên giúp vỏ bánh có đường gân nổi bật hơn. Cuối cùng là người làm bánh sẽ phết 1 lớp lòng đỏ trứng gà lên lớp bột và cho vào lò nướng là xong.
Điểm lưu ý của món bánh Wellington "quý tộc" này là người thợ khi thực hiện cuộn các lớp nguyên liệu phải dùng lực và thật chặt tay để các lớp nguyên liệu dính chặt vào nhau đến mức không có một khe hở nào thì sau khi hoàn thành và cắt bánh ra, món bánh mới hoàn hảo được.
Như vậy, có lẽ không cần biết qua các công đoạn chế biến cầu kỳ cũng như các nguyên liệu cao cấp mà chỉ cần nhìn các lát cắt của bò cuộn Wellington là bạn đủ cảm nhận đây là món ăn không phải "dạng tầm thường". Khi nếm thử món ăn, bạn sẽ cảm nhận ngay độ giòn hoàn hảo của vỏ bánh, độ thơm ngon và ngọt của lớp nấm cùng với thịt bò mềm như tan chảy trong miệng, chắc chắn nếu có cơ hội ăn thử một lần sẽ vô cùng thích thú.
*Nguồn: Tasty*

Cache-Control: private

Set-Cookie: bepvang.org.vn-Anonymous-Lang=vi-VN; expires=Wed, 24-Jan-2018 23:56:44 GMT; path=/


text:
Khi đến Nhật Bản thì mì là món ăn dễ dàng tìm thấy nhất bởi các quán mì có mặt ở khắp mọi nơi, nhất là khu Tokyo sầm uất. Thế nhưng, một tô mì có nước dùng màu xanh như nước biển thế này thì có lẽ nhiều bạn mới lần đầu tiên được chiêm ngưỡng. Và đặc biệt là món mì xanh lè này hoàn toàn có thật ở Nhật Bản chứ không phải một trò đùa của bất kỳ ai bạn nhé.
Kipposhi là tên quán mì ở Nhật Bản chỉ mới được mở vào tháng 7 năm 2016, thế nhưng đã nhanh chóng được nhiều người biết đến bởi thực đơn vô cùng đặc biệt nhờ món mì xanh độc đáo.
Trong khi thiết kế nội thất của Kipposhi đều dùng hai màu chủ đạo là nâu và trắng để tạo cảm giác ấm áp và sạch sẽ cho quán ăn thì món mì ở đây lại có màu xanh vô cùng đặc biệt và rất lạ mắt.
Món mì xanh lấy cảm hứng từ Hawaii
Chia sẻ về màu sắc xanh của món mì, ông chủ Koizumi cho biết nó được lấy cảm hứng từ biển Hawaii. Ông Koizumi muốn các thực khách vừa thưởng thức món mì của mình, vừa trải nghiệm cảm giác như đang đứng trước bờ biển xanh mát mắt của Hawaii nên đã tạo ra màu sắc đặc biệt này.
Hiện tại, công thức làm ra màu xanh đặc biệt của món mì ở Kipposhi vẫn còn được ông chủ giữ bí mật nhưng ông cam đoan với các khách hàng rằng thành phần tạo màu cho món mì này đều được chế biến tự nhiên và bảo đảm an toàn sức khỏe.
Và khi đến Kipposhi, nếu tinh ý bạn sẽ phát hiện ông chủ Koizumi có một mái tóc màu hồng sáng rất đặc biệt mà hiếm có thể tìm thấy "quả đầu" thứ 2 như thế này ở Nhật Bản. Chia sẻ vì sao lại chọn màu hồng nhuộm mái tóc thì ông chủ Koizumi cho biết màu hồng sáng này với màu xanh của món mì là một cặp bài trùng khi đi cạnh nhau sẽ tương phản nhau và giúp nhau nổi bật hơn, đó là lý do ông đã chọn màu hồng sáng nhuộm tóc.
Có lẽ do có màu sắc quá đặc biệt như vậy nên món mì xanh của Kipposhi nhanh chóng được lan truyền trên mạng ngay sau khi ông chủ Koizumi đăng tải hình ảnh của món mì này trên Instagram vào đầu năm 2017. Thậm chí, hình ảnh tô mì xanh không chỉ lan truyền và chia sẻ trên mạng xã hội mà liên tục có nhiều bài báo đã viết về món mì này, về quán mì Kipposhi và cả về ông chủ đặc biệt vui tính Koizumi.
Hương vị mì xanh có gì đặc biệt?
Để tạo được cảm giác đang đứng trước bờ biển xanh thẳm trong vắt thì phần nước dùng mì cũng phải thật trong veo. Tuy nhiên, nếu đun sôi gà ở nhiệt độ cao và lâu thì nước sẽ trở nên đục ngầu. Do đó, ông Koizumi đã sử dụng một kỹ thuật Trung Quốc gọi là "Chintan" và đun sôi súp gà cùng với thịt băm. Thịt băm có tác dụng hút các chất vẩn đục trong nước dùng nên sau khi đun chỉ cần vớt thịt băm ra thì nước dùng sẽ trong vắt ngay.
Do đó, mặc dù lúc đầu ai cũng ngần ngại khi cho nước dùng vào miệng nhưng sau khi nếm thử thì hầu như mọi người đều cảm nhận được hương vị tinh khiết và ngọt thanh. Nếu bạn muốn tìm một món ăn nào đó nhẹ nhàng thì tô mì xanh ở Kipposhi sẽ là lựa chọn hoàn hảo.
Tô mì xanh ngoài nước dùng và mì sợi thì còn được cho thêm vài lát thịt gà, một quả trứng luộc, rau xanh và một ít hành thái sợi. Khi dùng đũa khuấy tô mì thì các nguyên liệu bắt đầu ngấm nước dùng và cũng chuyển sang màu xanh nhạt đẹp mắt.
Nếu như trước đây khi nhìn hình ảnh trên mạng xã hội thì rất nhiều người nghĩ rằng tô mì này được tạo ra từ các hiệu ứng thông dụng hiện nay nhưng khi được nhân viên đặt tô mì trước mặt thì hầu như ai cũng cảm thấy vô cùng phấn khích bởi màu xanh đúng như những gì họ thấy trên ảnh. Mỗi tô mì xanh có giá 900 yên (khoảng 180.000 VNĐ) nên nếu có dịp đến Nhật Bản thì bạn cũng nên ghé ăn thử một lần cho biết cảm giác thưởng thức tô mì lấy cảm hứng từ biển Hawaii ra sao nhé!
Nguồn: Matcha-jp

markdown:
Khi đến Nhật Bản thì mì là món ăn dễ dàng tìm thấy nhất bởi các quán mì có mặt ở khắp mọi nơi, nhất là khu Tokyo sầm uất. Thế nhưng, một tô mì có nước dùng màu xanh như nước biển thế này thì có lẽ nhiều bạn mới lần đầu tiên được chiêm ngưỡng. Và đặc biệt là món mì xanh lè này hoàn toàn có thật ở Nhật Bản chứ không phải một trò đùa của bất kỳ ai bạn nhé.
Kipposhi là tên quán mì ở Nhật Bản chỉ mới được mở vào tháng 7 năm 2016, thế nhưng đã nhanh chóng được nhiều người biết đến bởi thực đơn vô cùng đặc biệt nhờ món mì xanh độc đáo.
Trong khi thiết kế nội thất của Kipposhi đều dùng hai màu chủ đạo là nâu và trắng để tạo cảm giác ấm áp và sạch sẽ cho quán ăn thì món mì ở đây lại có màu xanh vô cùng đặc biệt và rất lạ mắt.
**Món mì xanh lấy cảm hứng từ Hawaii **
Chia sẻ về màu sắc xanh của món mì, ông chủ Koizumi cho biết nó được lấy cảm hứng từ biển Hawaii. Ông Koizumi muốn các thực khách vừa thưởng thức món mì của mình, vừa trải nghiệm cảm giác như đang đứng trước bờ biển xanh mát mắt của Hawaii nên đã tạo ra màu sắc đặc biệt này.
Hiện tại, công thức làm ra màu xanh đặc biệt của món mì ở Kipposhi vẫn còn được ông chủ giữ bí mật nhưng ông cam đoan với các khách hàng rằng thành phần tạo màu cho món mì này đều được chế biến tự nhiên và bảo đảm an toàn sức khỏe.
![Độc đáo tô mì "xanh lè" ở Nhật Bản mới nhìn qua cứ tưởng là trò đùa - Ảnh 3. Độc đáo tô mì "xanh lè" ở Nhật Bản mới nhìn qua cứ tưởng là trò đùa - Ảnh 3.](/Userfiles/Upload/images/Download/2018/1/10/8246dd1f8648432d9460e5d1cd58113f.jpeg)
Và khi đến Kipposhi, nếu tinh ý bạn sẽ phát hiện ông chủ Koizumi có một mái tóc màu hồng sáng rất đặc biệt mà hiếm có thể tìm thấy "quả đầu" thứ 2 như thế này ở Nhật Bản. Chia sẻ vì sao lại chọn màu hồng nhuộm mái tóc thì ông chủ Koizumi cho biết màu hồng sáng này với màu xanh của món mì là một cặp bài trùng khi đi cạnh nhau sẽ tương phản nhau và giúp nhau nổi bật hơn, đó là lý do ông đã chọn màu hồng sáng nhuộm tóc.
Có lẽ do có màu sắc quá đặc biệt như vậy nên món mì xanh của Kipposhi nhanh chóng được lan truyền trên mạng ngay sau khi ông chủ Koizumi đăng tải hình ảnh của món mì này trên Instagram vào đầu năm 2017. Thậm chí, hình ảnh tô mì xanh không chỉ lan truyền và chia sẻ trên mạng xã hội mà liên tục có nhiều bài báo đã viết về món mì này, về quán mì Kipposhi và cả về ông chủ đặc biệt vui tính Koizumi.
**Hương vị mì xanh có gì đặc biệt? **
Để tạo được cảm giác đang đứng trước bờ biển xanh thẳm trong vắt thì phần nước dùng mì cũng phải thật trong veo. Tuy nhiên, nếu đun sôi gà ở nhiệt độ cao và lâu thì nước sẽ trở nên đục ngầu. Do đó, ông Koizumi đã sử dụng một kỹ thuật Trung Quốc gọi là "Chintan" và đun sôi súp gà cùng với thịt băm. Thịt băm có tác dụng hút các chất vẩn đục trong nước dùng nên sau khi đun chỉ cần vớt thịt băm ra thì nước dùng sẽ trong vắt ngay.
Do đó, mặc dù lúc đầu ai cũng ngần ngại khi cho nước dùng vào miệng nhưng sau khi nếm thử thì hầu như mọi người đều cảm nhận được hương vị tinh khiết và ngọt thanh. Nếu bạn muốn tìm một món ăn nào đó nhẹ nhàng thì tô mì xanh ở Kipposhi sẽ là lựa chọn hoàn hảo.
Tô mì xanh ngoài nước dùng và mì sợi thì còn được cho thêm vài lát thịt gà, một quả trứng luộc, rau xanh và một ít hành thái sợi. Khi dùng đũa khuấy tô mì thì các nguyên liệu bắt đầu ngấm nước dùng và cũng chuyển sang màu xanh nhạt đẹp mắt.
Nếu như trước đây khi nhìn hình ảnh trên mạng xã hội thì rất nhiều người nghĩ rằng tô mì này được tạo ra từ các hiệu ứng thông dụng hiện nay nhưng khi được nhân viên đặt tô mì trước mặt thì hầu như ai cũng cảm thấy vô cùng phấn khích bởi màu xanh đúng như những gì họ thấy trên ảnh. Mỗi tô mì xanh có giá 900 yên (khoảng 180.000 VNĐ) nên nếu có dịp đến Nhật Bản thì bạn cũng nên ghé ăn thử một lần cho biết cảm giác thưởng thức tô mì lấy cảm hứng từ biển Hawaii ra sao nhé!
*Nguồn: Matcha-jp*

Set-Cookie: bepvang.org.vn-Anonymous-Lang=vi-VN; expires=Thu, 25-Jan-2018 00:05:05 GMT; path=/


text:
-
-
Thể loại
- Cổ Trang - Thần Thoại
- Võ Thuật - Kiếm Hiệp
- Phiêu lưu - Hành động
- Tâm Lý - Tình Cảm
- Phim Hoạt Hình
- Khoa Học - Viễn Tưởng
- Hình Sự - Chiến Tranh
- Tài Liệu - Khám Phá
- Văn Hóa - Tâm Linh
- Hài Hước
- Thể Thao - Âm Nhạc
- Kinh Dị - Ma
- Gia Đình - Học Đường
- TV Show
- Chiếu Rạp
- Xuyên Không
- Phim Thuyết Minh
- Phim Lồng Tiếng
- Trinh Thám
- Quốc gia
- Phim lẻ
- Phim bộ
- Phim hoạt hình
- Phim xem nhiều
- Phim chiếu rạp

markdown:
-
-
[Thể loại](/the-loai)
-
[Cổ Trang - Thần Thoại](/the-loai/co-trang-than-thoai-6.html)
-
[Võ Thuật - Kiếm Hiệp](/the-loai/vo-thuat-kiem-hiep-4.html)
-
[Phiêu lưu - Hành động](/the-loai/phieu-luu-hanh-dong-1.html)
-
[Tâm Lý - Tình Cảm](/the-loai/tam-ly-tinh-cam-51.html)
-
[Phim Hoạt Hình](/the-loai/phim-hoat-hinh-55.html)
-
[Khoa Học - Viễn Tưởng](/the-loai/khoa-hoc-vien-tuong-2.html)
-
[Hình Sự - Chiến Tranh](/the-loai/hinh-su-chien-tranh-7.html)
-
[Tài Liệu - Khám Phá](/the-loai/tai-lieu-kham-pha-3.html)
-
[Văn Hóa - Tâm Linh](/the-loai/van-hoa-tam-linh-53.html)
-
[Hài Hước](/the-loai/hai-huoc-52.html)
-
[Thể Thao - Âm Nhạc](/the-loai/the-thao-am-nhac-54.html)
-
[Kinh Dị - Ma](/the-loai/kinh-di-ma-5.html)
-
[Gia Đình - Học Đường](/the-loai/gia-dinh-hoc-duong-58.html)
-
[TV Show](/the-loai/tv-show-57.html)
-
[Chiếu Rạp](/the-loai/chieu-rap-56.html)
-
[Xuyên Không](/the-loai/xuyen-khong-61.html)
-
[Phim Thuyết Minh](/the-loai/phim-thuyet-minh-59.html)
-
[Phim Lồng Tiếng](/the-loai/phim-long-tieng-60.html)
-
[Trinh Thám](/the-loai/trinh-tham-62.html)
-
-
[Quốc gia](/quoc-gia)
-
[Phim lẻ](/danh-sach/phim-le.html)
-
[Phim bộ](/danh-sach/phim-bo.html)
-
[Phim hoạt hình](/the-loai/hoat-hinh-55.html) [Phim xem nhiều](/phim-xem-nhieu) [Phim chiếu rạp](/phim-chieu-rap)

Server: cloudflare


text:
Bạn vui lòng sử dụng trình duyệt Chrome để xem phim tốt hơn
Nếu bạn không xem được phim hoặc load chậm vui lòng chọn server #ST, #GS hoặc các server khác nếu có.
HD1
#1 GD #2 GD #3 OP #4 ST #5 GS #6 GS
Nội dung phim
Phim Bóng Hình Trong Tim - Ngao Asoke (2016) được remake từ bản Ngao Asoke năm 1999 và 2008. Monthai (Sean) là công tử của dòng họ Mahathada quyền quý, Mẹ của anh đã bức tử mối tình đầu của anh chỉ vì cô xuất thân thấp hèn. Nỗi đau khắc ghi vào tận tâm gan của anh, anh rời bỏ Thái Lan, nơi chỉ có máu và nước mắt đến một chân trời mới. 10 năm dài đằng đẵng những gì anh biết về gia đinh mình đều qua những dòng thư của vị hôn phu Wiyada. 10 năm vết thương ... Xem thêm

markdown:
Bạn vui lòng sử dụng trình duyệt Chrome để xem phim tốt hơn
Nếu bạn không xem được phim hoặc load chậm vui lòng chọn server #ST, #GS hoặc các server khác nếu có.
HD1
#1 GD #2 GD #3 OP #4 ST #5 GS #6 GS
### Nội dung phim
Phim Bóng Hình Trong Tim - Ngao Asoke (2016) được remake từ bản Ngao Asoke năm 1999 và 2008. Monthai (Sean) là công tử của dòng họ Mahathada quyền quý, Mẹ của anh đã bức tử mối tình đầu của anh chỉ vì cô xuất thân thấp hèn. Nỗi đau khắc ghi vào tận tâm gan của anh, anh rời bỏ Thái Lan, nơi chỉ có máu và nước mắt đến một chân trời mới. 10 năm dài đằng đẵng những gì anh biết về gia đinh mình đều qua những dòng thư của vị hôn phu Wiyada. 10 năm vết thương ...


text:
Cú pháp tìm kiếm phim nhanh nhất trên Google: [Tên phim + bilutv]. Xem hướng dẫn tại đây tại đây
Bạn vui lòng sử dụng trình duyệt Chrome để xem phim tốt hơn
Chọn tập
Diễm Cốt
Colourful Bone (2017)
Boruto: Naruto Thế Hệ Tiếp Theo
Boruto: Naruto Next Generations (2017)
Yêu Xa
Long-Distance Relationship (2017)
Nhân Cách Trong Em
Man is Not Real Woman (2017)
Quay Trở Lại
Return (2018)
Cuộc Sống Trong Tù
Wise Prison Life (2017)
Kỵ Sĩ Áo Đen
Black Knight (2017)
Khoảng Cách Tình Yêu
Just Between Lovers (2017)
Nước Mắt Thiên Đường
Tears Of Heaven (2015)
Gõ Cửa Tình Yêu
Never Ending Love (2015)
Báo lỗi phim
Copyright © 2018 BiluTV.com. All Rights Reserved. Nội dung được chia sẻ miễn phí giữa các thành viên.
Giới thiệu
Đóng góp
Quy định
Trợ giúp


text:
Bạn vui lòng sử dụng trình duyệt Chrome để xem phim tốt hơn
Nếu bạn không xem được phim hoặc load chậm vui lòng chọn server #ST, #GS hoặc các server khác nếu có.
HD1
#1 GD #2 OP #3 ST #4 GS #5 GS
Nội dung phim
Phim Kinh Hoa Yên Vân Diêu, Tăng, Ngưu là ba gia tộc sẽ làm nên câu chuyện của bộ phim này. Trong ba gia tộc trên thì Diêu và Tăng là hai nhà gắn bó thân thiết với nhau nhất vì khi xưa trong lúc chạ loạn Tang Văn Phác đã cứu giúp Diêu Mộc Lan và nhận cô làm con nuôi. Sau đó nhà hai nhà họ cũng kết thành thông gia. Lúc đó Mộc Lan có tình cảm với Khổng Lập Phu nhưng em gái Mạc Sầu của cô đã bỏ chạy trong lúc hôn lễ sắp diễn ra nên ... Xem thêm

markdown:
Bạn vui lòng sử dụng trình duyệt Chrome để xem phim tốt hơn
Nếu bạn không xem được phim hoặc load chậm vui lòng chọn server #ST, #GS hoặc các server khác nếu có.
HD1
#1 GD #2 OP #3 ST #4 GS #5 GS
### Nội dung phim
Phim Kinh Hoa Yên Vân Diêu, Tăng, Ngưu là ba gia tộc sẽ làm nên câu chuyện của bộ phim này. Trong ba gia tộc trên thì Diêu và Tăng là hai nhà gắn bó thân thiết với nhau nhất vì khi xưa trong lúc chạ loạn Tang Văn Phác đã cứu giúp Diêu Mộc Lan và nhận cô làm con nuôi. Sau đó nhà hai nhà họ cũng kết thành thông gia. Lúc đó Mộc Lan có tình cảm với Khổng Lập Phu nhưng em gái Mạc Sầu của cô đã bỏ chạy trong lúc hôn lễ sắp diễn ra nên ...


text:
300 +
8000 +
10000 +
6500 +
Công ty cổ phần công nghệ BNC Việt Nam
Trụ sở chính: Tầng 8, 51 Lê Đại Hành, Hai Bà Trưng, Hà Nội
Chi nhánh Hồ Chí Minh: Tháp R1 The everich 968 đường 3 tháng 2 - Phường 15 - Quân 11 - TP.HCM
Chi nhánh Vinh: Số 02B - Đường Phạm Ngũ Lão - Phường Cửa Nam - TP Vinh
Website : www.webbnc.net - Email : [email protected]
Ngân hàng TMCP Ngoại Thương Việt Nam
- Chủ tài khoản: Công ty Cổ phần Công Nghệ Webbnc Việt Nam
- Số tài khoản : 0021000278080
Ngân hàng Techcombank (Chi nhánh Sài Đồng) - Chủ tài khoản: Công ty Cổ phần Công Nghệ Webbnc Việt Nam
- Số tài khoản : 19027089988868
Ngân hàng Techcombank (Chi nhánh Phú Thọ - TP. Hồ Chí Minh)
- Chủ tài khoản: Chi nhánh tại TP.HCM - Công ty Cổ phần Công Nghệ Webbnc Việt Nam
- Số tài khoản : 19027762186019
Ngân hàng Agribank (Chi nhánh Phú Nhuận - TP HCM)
- Chủ tài khoản: Chi nhánh tại TP.HCM - Công ty Cổ phần Công Nghệ Webbnc Việt Nam
- Số tài khoản : 1604201025832

X-Frame-Options: DENY

Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform


text:
Cách làm kem dưỡng da chống lão hóa tại nhà
Thêm một tuổi mới, đừng sợ già đi, vì bạn đã có sẵn bộ ba sản phẩm dưỡng da chống lão hóa với thành phần hoàn toàn từ nguyên liệu tự nhiên. Mỹ phẩm...
Thêm một tuổi mới, đừng sợ già đi, vì bạn đã có sẵn bộ ba sản phẩm dưỡng da chống lão hóa với thành phần hoàn toàn từ nguyên liệu tự nhiên. Mỹ phẩm...
Chống lão hóa là một quá trình lâu dài và tốn kém. Các loại sản phẩm chống lão hóa thường có mức giá cao hơn so với sản phẩm dưỡng da khác. Thế nhưng, vài...
Để quá trình chăm dưỡng làn da có kết quả tối ưu, bạn cần phải loại ra khỏi danh sách những sản phẩm làm đẹp của mình có chứa các chất “khắc tinh” với...

markdown:
##
[Cách làm kem dưỡng da chống lão hóa tại nhà](http://cachtrangda.biz/cach-lam-kem-duong-da-chong-lao-hoa-tai-nha.html)
Thêm một tuổi mới, đừng sợ già đi, vì bạn đã có sẵn bộ ba sản phẩm dưỡng da chống lão hóa với thành phần hoàn toàn từ nguyên liệu tự nhiên. Mỹ phẩm...

Vary: Accept-Encoding,Cookie,User-Agent


text:
- Nhạc Hàn Quốc
- Nhạc chờ theo tên
- Nhạc cực hay chọn lọc
- Nhạc trẻ hay nhất
- Nhạc không lời hay nhất
- Nhạc chế hay nhất
- Nhạc chờ Hot nhất tháng
- Nhạc chờ Hot nhất tuần
- Nhạc chờ Hot nhất hiện nay
- Nhạc hot chọn lọc
- Nhạc trẻ hot nhất
- Nhạc chờ 12 cung hoàng đạo
- Nhạc RAP
- Nhạc độc đáo
- Nhạc chờ hài hước
- Nhạc chờ vui
- Nhạc chờ cười
- Nhạc chế
- Nhạc remix
- Nhạc cho vợ yêu
- Nhạc cho chồng yêu
- Nhạc cho đại ca
- Nhạc kinh dị - ma
- Nhạc VIP
- Âm thanh cuộc sống
- Nhạc thể thao
- Nhạc Trịnh Công Sơn
- Nhạc trẻ em
- Nhạc bà bầu
- Nhạc quảng cáo
- Nhạc game
- Nhạc Thiên Chúa giáo
- Nhạc Phật
- Nhạc chờ phim
- Nhạc trẻ
- Việt Nam Idol
- Nhạc trữ tình
- Nhạc thiếu nhi
- Nhạc cách mạng - nhạc đỏ
- Nhạc không lời - cổ điển
- Love song
- Nhạc quốc tế
- Nhạc hướng về biển Đông
- Nhạc Việt
- Nhạc vàng
- Dân ca-chèo-cải lương
- Mừng sinh nhật
- Tết - năm mới
- Nhạc vui đón tết
- Nhạc đám cưới
- Nhạc chờ mùa xuân
- Valentine 14-2
- QT phụ nữ 8-3
- Cá tháng tư 1-4
- Quốc tế thiếu nhi 1-6
- Trung thu 15-8
- Halloween 31-10
- Phụ nữ VN 20-10
- Nhà giáo Việt Nam 20-11
- Giáng sinh - noel 25-12
Cài làm NHẠC CHỜ, soạn: CHO MãSố
Tặng bạn bè, soạn: CHO MãSố SốĐT
Tặng bạn bè, soạn: CHO MãSố SốĐT
gửi 8377
Nhạc chờ Dương Hồng Loan,Bảo Phi (Mobifone Funring)
Ghi chú về ca sĩ Dương Hồng Loan,Bảo Phi
- Để tải/ cài đặt một bài hát trong danh sách nhạc chờ Dương Hồng Loan,Bảo Phi (Mobifone Funring) làm nhạc chờ: Bạn đưa chuột vào tên bài hát để xem hướng dẫn
- Nghe nhạc chờ Dương Hồng Loan,Bảo Phi - Mobifone: click chuột vào tên bài hát hoặc nút play ở bên phải
- Tải nhạc chờ Dương Hồng Loan,Bảo Phi Mobifone Funring về máy tính: click vào nút tải (download) ở bên phải
Từ khóa tìm kiếm:
Tải nhạc chờ Dương Hồng Loan,Bảo Phi Mobifone Funring về máy tính/ điện thoại
Nghe nhạc chờ Dương Hồng Loan,Bảo Phi Mobifone online (mp3); cài đặt nhạc chờ Dương Hồng Loan,Bảo Phi Mobifone Funring; nhạc chờ Mobifone của Dương Hồng Loan,Bảo Phi; nhạc chờ Mobifone Dương Hồng Loan,Bảo Phi; mã số nhạc chờ Dương Hồng Loan,Bảo Phi Funring;
Tai nhac cho Duong Hong Loan,Bao Phi Mobifone Funring ve dien thoai/ may tinh;
nghe nhac cho Duong Hong Loan,Bao Phi Mobifone Funring mp3 online; cai nhac cho dat Duong Hong Loan,Bao Phi mang Mobifone Funring; nhac cho Mobifone Funring cua Duong Hong Loan,Bao Phi; ma so nhac cho Duong Hong Loan,Bao Phi mang Mobifone Funring;

markdown:
[Nhạc Hàn Quốc](/mobifone/nhac-cho-han-quoc/) [Nhạc chờ theo tên](/mobifone/nhac-cho-theo-ten/) [Nhạc cực hay chọn lọc](/mobifone/nhac-cho-cuc-hay-chon-loc/) [Nhạc trẻ hay nhất](/mobifone/nhac-cho-tre-hay-nhat/) [Nhạc không lời hay nhất](/mobifone/nhac-cho-khong-loi-hay-nhat/) [Nhạc chế hay nhất](/mobifone/nhac-cho-che-hay-nhat/) [Nhạc chờ Hot nhất tháng](/mobifone/nhac-cho-hot-nhat-thang/) [Nhạc chờ Hot nhất tuần](/mobifone/nhac-cho-hot-nhat-tuan/) [Nhạc chờ Hot nhất hiện nay](/mobifone/nhac-cho-hot-nhat-hien-nay/) [Nhạc hot chọn lọc](/mobifone/nhac-cho-hot-chon-loc/) [Nhạc trẻ hot nhất](/mobifone/nhac-cho-tre-hot-nhat/) [Nhạc chờ 12 cung hoàng đạo](/mobifone/nhac-cho-12-cung-hoang-dao/) [Nhạc RAP](/mobifone/nhac-cho-rap/) [Nhạc độc đáo](/mobifone/nhac-cho-doc-dao/) [Nhạc chờ hài hước](/mobifone/nhac-cho-hai-huoc/) [Nhạc chờ vui](/mobifone/nhac-cho-vui/) [Nhạc chờ cười](/mobifone/nhac-cho-cuoi/) [Nhạc chế](/mobifone/nhac-cho-che/) [Nhạc remix](/mobifone/nhac-cho-remix/) [Nhạc cho vợ yêu](/mobifone/nhac-cho-vo-yeu/) [Nhạc cho chồng yêu](/mobifone/nhac-cho-chong-yeu/) [Nhạc cho đại ca](/mobifone/nhac-cho-dai-ca/) [Nhạc kinh dị - ma](/mobifone/nhac-cho-kinh-di-ma/) [Nhạc VIP](/mobifone/nhac-cho-vip/) [Âm thanh cuộc sống](/mobifone/nhac-cho-am-thanh-cuoc-song/) [Nhạc thể thao](/mobifone/nhac-cho-the-thao/) [Nhạc Trịnh Công Sơn](/mobifone/nhac-cho-trinh-cong-son/) [Nhạc trẻ em](/mobifone/nhac-cho-tre-em/) [Nhạc bà bầu](/mobifone/nhac-cho-ba-bau/) [Nhạc quảng cáo](/mobifone/nhac-cho-quang-cao/) [Nhạc game](/mobifone/nhac-cho-game/) [Nhạc Thiên Chúa giáo](/mobifone/nhac-cho-thien-chua-giao/) [Nhạc Phật](/mobifone/nhac-cho-phat/) [Nhạc chờ phim](/mobifone/nhac-cho-phim/) [Nhạc trẻ](/mobifone/nhac-cho-tre/) [Việt Nam Idol](/mobifone/nhac-cho-viet-nam-idol/) [Nhạc trữ tình](/mobifone/nhac-cho-tru-tinh/) [Nhạc thiếu nhi](/mobifone/nhac-cho-thieu-nhi/) [Nhạc cách mạng - nhạc đỏ](/mobifone/nhac-cho-cach-mang-nhac-do/) [Nhạc không lời - cổ điển](/mobifone/nhac-cho-khong-loi-co-dien/) [Love song](/mobifone/nhac-cho-love-song/) [Nhạc quốc tế](/mobifone/nhac-cho-quoc-te/) [Nhạc hướng về biển Đông](/mobifone/nhac-cho-huong-ve-bien-dong/) [Nhạc Việt](/mobifone/nhac-cho-viet/) [Nhạc vàng](/mobifone/nhac-cho-vang/) [Dân ca-chèo-cải lương](/mobifone/nhac-cho-dan-ca-cheo-cai-luong/) [Mừng sinh nhật](/mobifone/nhac-cho-mung-sinh-nhat/) [Tết - năm mới](/mobifone/nhac-cho-tet-nam-moi/) [Nhạc vui đón tết](/mobifone/nhac-cho-vui-don-tet/) [Nhạc đám cưới](/mobifone/nhac-cho-dam-cuoi/) [Nhạc chờ mùa xuân](/mobifone/nhac-cho-mua-xuan/) [Valentine 14-2](/mobifone/nhac-cho-valentine-14-2/) [QT phụ nữ 8-3](/mobifone/nhac-cho-qt-phu-nu-8-3/) [Cá tháng tư 1-4](/mobifone/nhac-cho-ca-thang-tu-1-4/) [Quốc tế thiếu nhi 1-6](/mobifone/nhac-cho-quoc-te-thieu-nhi-1-6/) [Trung thu 15-8](/mobifone/nhac-cho-trung-thu-15-8/) [Halloween 31-10](/mobifone/nhac-cho-halloween-31-10/) [Phụ nữ VN 20-10](/mobifone/nhac-cho-phu-nu-vn-20-10/) [Nhà giáo Việt Nam 20-11](/mobifone/nhac-cho-nha-giao-viet-nam-20-11/) [Giáng sinh - noel 25-12](/mobifone/nhac-cho-giang-sinh-noel-25-12/)
Cài làm NHẠC CHỜ, soạn: CHO MãSố
Tặng bạn bè, soạn: CHO MãSố SốĐT
Tặng bạn bè, soạn: CHO MãSố SốĐT
**gửi**8377 **Chú ý:**Số ĐT được tặng nhạc chờ phải cùng mạng điện thoại với bạn và đang sử dụng dịch vụ nhạc chờ
### Nhạc chờ Dương Hồng Loan,Bảo Phi (Mobifone Funring)
**Ghi chú về ca sĩ Dương Hồng Loan,Bảo Phi** **Để tải/ cài đặt một bài hát trong danh sách nhạc chờ Dương Hồng Loan,Bảo Phi (Mobifone Funring) làm nhạc chờ:**Bạn đưa chuột vào tên bài hát để xem hướng dẫn **Nghe nhạc chờ Dương Hồng Loan,Bảo Phi - Mobifone:**click chuột vào tên bài hát hoặc nút play ở bên phải **Tải nhạc chờ Dương Hồng Loan,Bảo Phi Mobifone Funring về máy tính:**click vào nút tải (download) ở bên phải **Từ khóa tìm kiếm**:
Tải nhạc chờ Dương Hồng Loan,Bảo Phi Mobifone Funring về máy tính/ điện thoại
Nghe nhạc chờ Dương Hồng Loan,Bảo Phi Mobifone online (mp3); cài đặt nhạc chờ Dương Hồng Loan,Bảo Phi Mobifone Funring; nhạc chờ Mobifone của Dương Hồng Loan,Bảo Phi; nhạc chờ Mobifone Dương Hồng Loan,Bảo Phi; mã số nhạc chờ Dương Hồng Loan,Bảo Phi Funring;
Tai nhac cho Duong Hong Loan,Bao Phi Mobifone Funring ve dien thoai/ may tinh;
nghe nhac cho Duong Hong Loan,Bao Phi Mobifone Funring mp3 online; cai nhac cho dat Duong Hong Loan,Bao Phi mang Mobifone Funring; nhac cho Mobifone Funring cua Duong Hong Loan,Bao Phi; ma so nhac cho Duong Hong Loan,Bao Phi mang Mobifone Funring;
**Chú ý:**Danh sách nhạc chờ theo ca sĩ Dương Hồng Loan,Bảo Phi - mạng Mobifone Funring ở dưới chỉ bao gồm nhạc chờ của riêng ca sĩ Dương Hồng Loan,Bảo Phi, nếu bạn muốn tìm nhạc chờ Mobifone Funring của ca sĩ Dương Hồng Loan,Bảo Phi hát cùng với các ca sĩ khác, vui lòng sử dụng box tìm kiếm phía trên và nhập vào tên bài hát hoặc từ khóa "Dương Hồng Loan,Bảo Phi"
|Nhạc chờ Mobifone hot nhất tháng|
|
|[](http://static.tainhaccho.vn/music/vms/367560/download) [](/mobifone/ca-si-kicm-masew-dat-g/buon-cua-anh.367560.htm#play) [Để cho em khóc](/mobifone/ca-si-vy-oanh/de-cho-em-khoc.247047.htm) [](http://static.tainhaccho.vn/music/vms/247047/download) [](/mobifone/ca-si-vy-oanh/de-cho-em-khoc.247047.htm#play) [Happy new year](/mobifone/ca-si-abba/happy-new-year.8516.htm) [](http://static.tainhaccho.vn/music/vms/8516/download) [](/mobifone/ca-si-abba/happy-new-year.8516.htm#play) [Cát bụi cuộc đời](/mobifone/ca-si-huynh-nguyen-cong-bang/cat-bui-cuoc-doi.162422.htm) [](http://static.tainhaccho.vn/music/vms/162422/download) [](/mobifone/ca-si-huynh-nguyen-cong-bang/cat-bui-cuoc-doi.162422.htm#play) [Để cho em khóc 2](/mobifone/ca-si-vy-oanh/de-cho-em-khoc-2.248530.htm) [](http://static.tainhaccho.vn/music/vms/248530/download) [](/mobifone/ca-si-vy-oanh/de-cho-em-khoc-2.248530.htm#play) [Mặt trời của em](/mobifone/ca-si-phuong-ly-justatee/mat-troi-cua-em.356708.htm) [](http://static.tainhaccho.vn/music/vms/356708/download) [](/mobifone/ca-si-phuong-ly-justatee/mat-troi-cua-em.356708.htm#play) [Buồn của anh](/mobifone/ca-si-k-icm-masew-dat-g/buon-cua-anh.367563.htm) [](http://static.tainhaccho.vn/music/vms/367563/download) [](/mobifone/ca-si-k-icm-masew-dat-g/buon-cua-anh.367563.htm#play) [Thuê bao quý khách vừa gọi tạm thời...](/mobifone/ca-si-vegastudio/thue-bao-quy-khach-vua-goi-tam-thoi-khong-lien-lac-duoc.140309.htm) [](http://static.tainhaccho.vn/music/vms/140309/download) [](/mobifone/ca-si-vegastudio/thue-bao-quy-khach-vua-goi-tam-thoi-khong-lien-lac-duoc.140309.htm#play) [Lạy phật quan âm](/mobifone/ca-si-thuy-trang/lay-phat-quan-am.54279.htm) [](http://static.tainhaccho.vn/music/vms/54279/download) [](/mobifone/ca-si-thuy-trang/lay-phat-quan-am.54279.htm#play) [Xem tiếp](/mobifone/nhac-cho-hot-nhat-thang/page2) [](https://plus.google.com/105589918140276225243/about)

X-C: YES,H:0 mobile

Accept-Ranges: bytes

Cache-Control: max-age=10800, public