青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

Introduction

My wife Farhana wants to resume her career as a software developer (she started her career as a software developer, but couldn't proceed much because of our first child's birth), and these days, I am trying to help her learn Object Oriented Designs as I've got some experience in software design and development.

Since my early days in software development, I have always observed that no matter how hard a technical issue seems, it always becomes easier if explained from a real life perspective and discussed in a conversational manner. As we had some fruitful conversations on Object Oriented Designs, I thought I could share it because someone might find it an interesting way of learning OOD.

Following is how our OOD conversation took place:

Topic: Introducing OOD

Shubho: Darling, let's start learning Object Oriented Designs. You know Object Oriented Principles, right?

Farhana: You mean, Encapsulation, Inheritance, and Polymorphism, right? Yes, I know the principles.

Shubho: OK, I hope you already know how to use classes and objects. Let us learn Object Oriented Designs today.

Farhana: Hold on a second. Isn't Object Oriented Principles enough to do Object Oriented programming? I mean, I can define classes and encapsulate properties and methods. I can also define a class hierarchy based upon their relationship. So, what's left?

Shubho: Good question. Object Oriented Principles and Object Oriented Design are actually two different things. Let me give you a real life example to help you understand.

When you were child you learned alphabets first, right?

Farhana: Yes.

Shubho: OK. You also learned words and how to assemble the alphabets to make those meaningful words. Along with that, you learned some basic grammar to assemble the words into sentences. For example, you had to maintain tenses, and you had to use prepositions, conjunctions, and others properly to create grammatically correct sentences. Say, a sentence like the following:

 Collapse
"I" (pronoun) "want" (Verb) "to" (Preposition) "learn" (Verb) "OOD" (Noun)

You see, you are assembling the words in some order, and you are also choosing the correct words to end up with a sentence that has some meaning.

Farhana: OK, so, what does this mean?

Shubho: This is analogous to Object Oriented Principles. OOP says about the basic principles and the core ideas to do Object Oriented programming. Here, OOP can be compared to the basic English grammar, where the basic grammar teaches you how to construct a meaningful and correct sentence using words, and OOP teaches you to construct classes, encapsulate properties and methods inside them, and also develop a hierarchy between them and use them in your code.

Farhana: Hm..I got the point. So, where does OOD fit here?

Shubho: You'll get your answer soon. Now, suppose you need to write articles and essays on some topics. You may also wish to write books on different subjects that you have expertise on. Knowing how to construct sentences is not enough to write good essays/articles or books, right? You need to write a lot, and need to learn to explain things in a good way so that readers can easily understand what you are trying to say.

Farhana: Seems interesting... carry on.

Shubho: Now, if you want to write a book on a particular subject (say, Learning Object Oriented Design), you got to know how to divide the subject into smaller topics. You also need to write chapters on those topics, and you need to write prefaces, introductions, explanations, examples, and many other paragraphs in the chapters. You need to design the overall book and learn some best practices of writing techniques so that the reader can easily understand what you are trying to explain. This is about the bigger picture.

In software development, OOD addresses the bigger picture. You need to design your software in a way that your classes and code are modularized, re-usable, and flexible, and there are some good guidelines to do that so that you don't have to re-invent the wheel. There are some design principles that you can apply to design your classes and objects. Makes sense?

Farhana: Hmm.. got the initial idea, but need to learn more.

Shubho: Don't worry, you will learn soon. Just let our discussion going.

Topic: Why OOD?

Shubho: This is a very important question. Why should we care about Object Oriented Design when we can create some classes quickly and finish development and deliver? Isn't that enough?

Farhana: Yes, I didn't know about OOD earlier, and still I was able to develop and deliver projects. So, what is the big deal?

Shubho: OK, let me get a classic quote for you:

"Walking on water and developing software from a specification are easy if both are frozen."

- Edward V. Berard

Farhana: You mean software development specifications keep changing constantly?

Shubho: Exactly! The universal truth of software is "your software is bound to change". Why?

Because, your software solves real life business problems and real life business processes evolve and change - always.

Your software does what it is supposed to do today and does it good enough. But, is your software smart enough to support "changes"? If not, you don't have a smartly designed software.

Farhana: OK, so, please explain "smartly designed software" sir!

Shubho: "A smartly designed software can adjust changes easily; it can be extended, and it is re-usable."

And, applying a good "Object Oriented Design" is the key to achieve such a smart design. Now, when can you claim that you have applied good OOD in your code?

Farhana: That's my question too.

Shubho: You are doing Object Oriented Design if your code is:

  • Of course, object oriented.
  • Re-usable.
  • Can be changed with minimal effort.
  • Can be extended without changing existing code.

Farhana: And..?

Shubho: We are not alone. Many people have already given lots of thoughts and put a lot of effort on this issue, and they've tried to achieve good Object Oriented Design and identify some basic principles for doing Object Oriented Design (some basic inspirations which you can use to lay out your object oriented design). They also have identified some common design patterns that are applicable to common scenarios (based on the basic principles).

Farhana: Can you name some?

Shubho: Sure. There are many design principles out there, but at the basic level, there are five principles which are abbreviated as the SOLID principles (thanks to Uncle Bob, the great OOD mentor).

 Collapse
S = Single Responsibility Principle
O = Opened Closed Principle 
L = Liscov Substitution Principle
I = Interface Segregation Principle
D = Dependency Inversion Principle

In the following discussion, we will try to understand each of these in detail.

Topic: Single Responsibility Principle

Shubho: Let me show you the poster first. We should thank the person who made the posters, these are really interesting.

Single Responsibility Principle poster

It says, "just because you can implement all the features in a single device, you shouldn't". Why? Because it adds a lot of manageability problems for you in the long run.

Let me tell you the principle in Object Oriented terms.

"There should never be more than one reason for a class to change."

Or, differently said: "A class should have one and only one responsibility".

Farhana: Can you please explain?

Shubho: Sure, this principle says that if you have a class that has more than one reason to change (or has more than one overall responsibility), you need to split the class into multiple classes based upon their responsibility.

Farhana: Hmm... does that mean that I can't have multiple methods in a single class?

Shubho: Not at all. Rather, you surely can have multiple methods in a single class. The issue is, they have to meet a single purpose. Now, why is splitting important?

It's important because:

  • Each responsibility is an axis of change.
  • Code becomes coupled if classes have more than one responsibility.

Farhana: Could you please give me an example?

Shubho: Sure, take a look at the following class hierarchy. Actually, this example is taken from Uncle Bob, so thanks to him again.

Class hierarchy showing violation of SRP principle

Here, the Rectangle class does the following:

  • It calculates the value of the rectangular area.
  • It renders the rectangle in the UI.

And, two applications are using this Rectangle class:

  • A computational geometry application uses this class to calculate the area
  • A graphical application uses this class to draw a rectangle in the UI

This is violating the SRP (Single Responsibility Principle)!

Farhana: How?

Shubho: You see, the Rectangle class is actually performing two different things. It is calculating the area in one method, and it is returning a GUI representation of the rectangle in another method. This leads to some interesting problems:

  • We must include the GUI in the computational geometry application. While deploying the geometry application, we must include the GUI library.
  • A change to the Rectangle class for the graphical application may lead to a change, build, and test for the computational geometry application, and vice-versa.

Farhana: It's getting interesting. So I guess we should break up the class based on its responsibilities, right?

Shubho: Exactly. Can you predict what we should do?

Farhana: Sure, let me try. Following is what we might need to do:

Separate the responsibilities into two different classes, such as:

  • Rectangle: This class should define the area() method.
  • RectangleUI: This class should inherit the Rectangle class and define the Draw() method.

Shubho: Perfect. In this case, the Rectangle class will be used by the computational geometry application, and the RectangleUI class will be used by the graphical application. We could even separate the classes into two separate DLLs, and that will allow us not to touch the other in case a change is needed to be implemented in one.

Farhana: Thanks, I think I understand SRP. One thing, SRP seems to be an idea of breaking things into molecular parts so that it becomes reusable and can be managed centrally. So, shouldn't we apply SRP in the method level as well? I mean, we might have written methods that have many lines of code for doing multiple things. These methods might be violating SRP, right?

Shubho: You got it right. You should break down your methods so that each method does a particular work. That will allow you to re-use methods, and in case a change is required, you are able to do the change by modifying minimal amount of code.

Topic: Open-Closed Principle

Shubho: Here goes the poster for the Open-Closed Principle:

Figure: Open Closed Principle poster

If I need to explain it in design oriented terms, it would be as follows:

"Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification."

At the most basic level, that means, you should be able to extend a class's behavior without modifying it. It's just like I should be able to put on a dress without doing any change to my body, ha ha.

Farhana: Interesting. You can change your look by putting any dress you want, and you don't have to change your body for that. So you are open for extension, right?

Shubho: Yes. In OOD, open for extensions means that the behavior of the module/class can be extended and we can make the module behave in new and different ways as the requirements change, or to meet the needs of new applications.

Farhana: And your body is closed for modification. I like this example. So, the source code for a core class or module should not be modified when it needs an extension. Can you explain with some examples?

Shubho: Sure, take a look at the following example. This doesn't support the "Open-Closed" principle:

Class hierarchy showing violation of Open Closed principle

You see, the Client and Server classes are both concrete. So, if for any reason, the server implementation is changed, the client also needs a change.

Farhana: Makes sense. If a browser is implemented as tightly coupled to a specific server (such as IIS), then if the server is replaced for some reason with another one (say, Apache) the browser also needs to be changed or replaced. That would be really horrible!

Shubho: Correct. So following would be the correct design:

Class hierarchy showing Open Closed Principle

In this example, there is an Abstract Server class added, and the client holds a reference to the abstract class, and the Concrete Server class implements the Abstract Server class. So, if for any reason the Server implementation is changed, the Client is not likely to require any change.

The Abstract Server class here is closed for modification, and the concrete class implementations here are openfor extension.

Farhana: As I understand, abstraction is the key, right?

Shubho: Yes, basically, you abstract the things that are the core concepts of your system, and if you do the abstraction well, most likely, it would require no change when the functionality is to be extended (such as the server is an abstract concept). And, you define the abstract things in the implementations (say, IISServer implements the Server) and code against abstractions (Server) as much as possible. This would allow you to extend the abstract thing and define a new implementation (say, ApacheServer) without doing any change in the client code.

Topic: Liskov's Substitution Principle

Shubho: The name "Liskov's Substitution Principle" sounds very heavy, but the idea is pretty basic. Take a look at this interesting poster:

Liskov Substitution Principle poster

The principle says:

"Subtypes must be substitutable for their base types."

Or, if said differently:

"Functions that use references to base classes must be able to use objects of derived classes without knowing it."

Farhana: Sorry, sounds confusing to me. I thought this is the basic rule of OOP. This is polymorphism, right? Why was an Object Oriented Principle required on this issue?

Shubho: Good question. Here is your answer:

In basic Object Oriented Principles, "Inheritance" is usually described as an "is a" relationship. If a "Developer" is a "SoftwareProfessional", then the "Developer" class should inherit the "SoftwareProfessional" class. Such "Is a" relationships are very important in class designs, but it's easy to get carried away and end up in a wrong design with a bad inheritance.

The "Liskov's Substitution Principle" is just a way of ensuring that inheritance is used correctly.

Farhana: I see. Interesting.

Shubho: Yes darling, indeed. Let's take a look at an example:

Class hierarchy showing an example of Liskov Substitution Principle

Here, the KingFisher class extends the Bird base class and hence inherits the Fly() method, which is pretty good.

Now take a look at the following example:

Corrected class hierarchy of Liskov Substitution Principle

Ostrich is a Bird (definitely it is!) and hence it inherits the Bird class. Now, can it fly? No! Here, the design violates the LSP.

So, even if in real world this seems natural, in the class design, Ostrich should not inherit the Bird class, and there should be a separate class for birds that can't really fly and Ostrich should inherit that.

Farhana: OK, understood. So, let me try to point out why the LSP is so important:

  • If LSP is not maintained, class hierarchies would be a mess, and if a subclass instance was passed as parameter to methods, strange behavior might occur.
  • If LSP is not maintained, unit tests for the base classes would never succeed for the subclass.

Am I right?

Shubho: You are absolutely right. You can design objects and apply LSP as a verification tool to test the hierarchy whether inheritance is properly done.

Topic: The Interface Segregation Principle

Shubho: Today, we will learn the "Interface Segregation Principle". Here is the poster:

Interface Segregation Principle poster

Farhana: What does it mean?

Shubho: It means the following:

"Clients should not be forced to depend upon interfaces that they do not use."

Farhana: Explain please.

Shubho: Sure, here is your explanation:

Suppose you want to purchase a television and you have two to choose from. One has many switches and buttons, and most of those seem confusing and doesn't seem necessary to you. Another has a few switches and buttons, which seems familiar and logical to you. Given that both televisions offer roughly the same functionality, which one would you choose?

Farhana: Obviously the second one with the fewer switches and buttons.

Shubho: Yes, but why?

Farhana: Because I don't need the switches and buttons that seem confusing and unnecessary to me.

Shubho: Correct. Similarly, suppose you have some classes and you expose the functionality of the classes using interfaces so that the outside world can know the available functionality of the classes and the client code can be done against interfaces. Now, if the interfaces are too big and have too many exposed methods, it would seem confusing to the outside world. Also, interfaces with too many methods are less re-usable, and such "fat interfaces" with additional useless methods lead to increased coupling between classes.

This also leads to another problem. If a class wants to implement the interface, it has to implement all of the methods, some of which may not be needed by that class at all. So, doing this also introduces unnecessary complexity, and reduces maintainability or robustness in the system.

The Interface Segregation principle ensures that Interfaces are developed so that each of them have their own responsibility and thus they are specific, easily understandable, and re-usable.

Farhana: I see. You mean interfaces should contain only the necessary methods and not anything else?

Shubho: Exactly. Let's see an example.

The following interface is a "Fat interface" which violates the Interface Segregation principle:

Example of an interface violating the Interface Segregation principle

Note that the IBird interface has many bird behaviours defined along with the Fly() behaviour. Now, if a Bird class (say, Ostrich) implements this interface, it has to implement the Fly() behaviour unnecessarily (Ostrich doesn't fly).

Farhana: That's correct. So, this interface must be split?

Shubho: Yes. The "Fat Interface" should be broken down into two different interfaces, IBird andIFlyingBird, where the IFlyingBird inherits IBird.

Correct version of the interface in the Interface Segregation principle example

If there is a bird that can't fly (say, Ostrich), it would implement the IBird interface. And if there is a bird that can fly (say, KingFisher), it would implement the IFlyingBird interface.

Farhana: So, if I go back to the example with the television with many switches and buttons, the manufacturer of that television must have a blueprint of that television where the switches and buttons are included in the plan. Whenever they want to create a new model of the television, if they need to re-use this blueprint, they would need to create as many switches and buttons as included in the plan. That wouldn't allow them to re-use the plan, right?

Shubho: Right.

Farhana: And, if they really want to re-use their plans, they should divide their television's blueprint into smaller pieces so that they can re-use the plan whenever any new kind of television is to be created.

Shubho: You got the idea.

Topic: The Dependency Inversion Principle

Shubho: This is the last principle among the SOLID principles. Here is the poster:

Dependency Inversion principle poster

It says..

"High level modules should not depend upon low level modules. Rather, both should depend upon abstractions."

Shubho: Let's consider a real world example to understand it. Your car is composed of lots of objects like the engine, the wheels, the air conditioner, and other things, right?

Farhana: Yes, of course.

Shubho: OK, none of these things are rigidly built within a single unit; rather, each of these are "pluggable" so that when the engine or the wheel has problem, you can repair it (without repairing the other things) and you can even replace it.

While replacement, you just have to ensure that the engine/wheel conforms to the car's design (say, the car would accept any 1500 CC engine and will run on any 18 inch wheel).

Also, the car might allow you to put a 2000 CC engine in place of the 1500 CC, given the fact that the manufacturer (say, Toyota) is the same.

Now, what if the different parts of your car were not built in such a "pluggable nature"?

Farhana: That would be horrible! Because, in that case, if your car's engine is out of order, you will have to fix the whole car or purchase a new one!

Shubho: Yes. Now, how can the "pluggable nature" be achieved?

Farhana: "Abstraction" is the key, right?

Shubho: Yes. In real world, Car is the higher level module/entity, and it depends on the lower level modules/entities like the Engines or Wheels.

Rather than directly depending on the Engines or Wheels, the car depends on the abstraction of some specification of Engine or Wheels so that if any the Engine or Wheel conforms to the abstraction, these could be assembled with the car and the car would run.

Let's take a look at the following class diagram:

Dependency Inversion principle class hierarchy

Shubho: In the above Car class, notice that there are two properties, and both of these are of abstract type (Interface) rather than concrete type.

The Engine and Wheels are pluggable because the car would accept any object implementing the declared interfaces, and that will not require any change in the Car class.

Farhana: So, if Dependency Inversion is not implemented in the code, we run the risk of:

  • Damaging the higher level code that uses the lower level classes.
  • Requiring too much time and effort to change the higher level code when a change occurs in the lower level classes.
  • Producing less-reusable code.

Shubho: You got it perfect darling!

Summary

Shubho: There are many other Object Oriented principles other than the SOLID principles. Some are:

  • "Composition over Inheritance": This says about favoring composition over inheritance.
  • "Principle of least knowledge": This says that "the less your class knows, the better".
  • "The Common Closure principle" : This says that "related classes should be packaged together".
  • "The Stable Abstractions principle": This says that "the more stable a class is, the more it must consist of abstract classes."

Farhana: Shouldn't I learn those principles too?

Shubho: Yes, of course. You have the whole world wide web to learn from. Just Google on those principles and try to understand. And of course, don't hesitate me to ask me if you need help.

Farhana: I've heard there are many Design Patterns built upon those design principles.

Shubho: You are right. Design Patterns are nothing but some commonly suggested design suggestions in commonly recurring situations. These are mainly inspired by the Object Oriented Design principles. You can think of Design Patterns as "Frameworks" and OOD principles as "Specifications".

Farhana: So, am I going to learn Design Patterns next?

Shubho: Yes darling.

Farhana: That would be exiting, right?

Shubho: Yes, that would be really exiting.

from:
http://www.codeproject.com/KB/architecture/SOLIDPrinciplesInOOD.aspx

posted on 2011-06-08 13:45 chatler 閱讀(1055) 評論(0)  編輯 收藏 引用 所屬分類: Designed Patterns
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩小视频在线观看专区| 欧美性大战久久久久久久| 亚洲欧美日韩天堂| 欧美mv日韩mv亚洲| 久久久精品免费视频| 国产精品高潮呻吟久久| 亚洲黄色免费| 亚洲国产美女精品久久久久∴| 欧美一级在线播放| 午夜一区不卡| 国产精品免费观看视频| 欧美日韩一区二区三区四区在线观看 | 亚洲欧美成人网| 一本久久a久久精品亚洲| 免费观看成人网| 欧美高清视频在线观看| 在线电影国产精品| 久久久99久久精品女同性| 久久久久免费视频| 国产一区二区久久久| 欧美一区二区三区久久精品| 欧美亚洲一级片| 国产日韩精品久久| 欧美亚洲综合网| 久久亚洲一区二区三区四区| 激情av一区| 麻豆精品在线视频| 亚洲国产日韩一区二区| 99国产精品自拍| 欧美日韩1区2区| 夜夜嗨av一区二区三区网站四季av| 宅男噜噜噜66一区二区| 欧美先锋影音| 午夜精品理论片| 久久久夜夜夜| 91久久精品国产91久久| 欧美精品国产精品| 亚洲婷婷综合色高清在线| 亚洲自拍高清| 国内精品国语自产拍在线观看| 久久久久久噜噜噜久久久精品| 欧美承认网站| 亚洲一本大道在线| 国产亚洲福利| 欧美暴力喷水在线| 中文在线一区| 久久综合久久综合这里只有精品 | 一区视频在线| 你懂的成人av| 亚洲一区视频在线观看视频| 久久久国际精品| 亚洲精品永久免费精品| 国产精品一区二区三区四区五区| 久久国产欧美| 国产精品一区二区久久精品| 久久精品成人| 亚洲精品一品区二品区三品区| 性欧美xxxx大乳国产app| 一区二区亚洲精品国产| 欧美日韩一区综合| 久久久精彩视频| 日韩亚洲欧美成人| 男人插女人欧美| 午夜亚洲视频| 日韩午夜电影av| 国产一区二区三区四区五区美女 | 久久久91精品国产一区二区三区| 欧美激情中文字幕一区二区 | 亚洲一区在线播放| 在线观看欧美一区| 国产精品午夜av在线| 欧美精品一二三| 久久人体大胆视频| 亚洲欧美日韩第一区| 亚洲免费av片| 欧美高清在线视频| 久久综合给合久久狠狠狠97色69| 中国女人久久久| 亚洲人成网站在线观看播放| 国产亚洲精品久久久久动| 欧美日韩国产精品专区| 牛牛精品成人免费视频| 欧美在线观看www| 亚洲综合欧美| 亚洲视频二区| 亚洲免费高清| 亚洲国产精品黑人久久久 | 欧美一级久久久久久久大片| 99在线精品视频| 91久久精品国产91久久性色| 狠狠操狠狠色综合网| 国产区二精品视| 国产精品女主播一区二区三区| 欧美日韩三级电影在线| 欧美精品久久久久久久免费观看 | 一区二区三区在线免费视频| 国产一区二区三区免费在线观看 | 中文精品一区二区三区| 亚洲经典一区| 亚洲黄色影院| 亚洲国产精品嫩草影院| 亚洲电影av| 亚洲日本一区二区三区| 亚洲欧洲日产国码二区| 亚洲黄一区二区三区| 欧美成人久久| 亚洲福利久久| 亚洲精品日韩在线观看| 亚洲人成网站999久久久综合| 亚洲黄色影片| 亚洲美女视频网| 中文在线一区| 午夜精品美女自拍福到在线| 午夜国产精品视频| 欧美在线视频观看| 久久久噜噜噜久久中文字免| 美女视频黄免费的久久| 欧美激情第4页| 欧美日韩国产成人在线观看| 国产精品成人aaaaa网站| 国产精品一卡二| 黄色av日韩| 亚洲精品一区二区三区四区高清 | 亚洲男人的天堂在线| 午夜精品久久久久久久99黑人| 久久都是精品| 欧美电影免费网站| 99国产精品国产精品毛片| 亚洲在线中文字幕| 久久久www成人免费毛片麻豆| 欧美刺激午夜性久久久久久久| 欧美日韩在线播放三区| 国产午夜精品美女视频明星a级| 精品动漫3d一区二区三区免费| 91久久精品一区二区三区| 欧美本精品男人aⅴ天堂| 欧美国产一区二区在线观看| 欧美激情按摩在线| 欧美日韩综合另类| 国产欧美精品一区aⅴ影院| 国产自产v一区二区三区c| 亚洲日本理论电影| 性做久久久久久久免费看| 欧美aⅴ99久久黑人专区| 99精品欧美一区| 久久久久亚洲综合| 欧美性jizz18性欧美| 尤物九九久久国产精品的分类| 在线视频日本亚洲性| 欧美中文在线观看| 亚洲精品欧美一区二区三区| 欧美伊人久久久久久久久影院| 巨胸喷奶水www久久久免费动漫| 国产精品ⅴa在线观看h| 亚洲高清成人| 久久精品99国产精品日本| 亚洲国产精品成人va在线观看| 午夜一区不卡| 欧美精品一区二区久久婷婷| 黑人操亚洲美女惩罚| 亚洲一区在线视频| 欧美黄在线观看| 久久av一区二区三区| 国产精品久久久久国产精品日日| 亚洲啪啪91| 免费欧美日韩国产三级电影| 亚洲欧美激情四射在线日| 欧美日韩国产精品一区| 亚洲国产日韩欧美在线99| 久久久久综合网| 亚洲欧美成人网| 国产精品久久久久久久第一福利| 亚洲精品国产精品国自产观看浪潮| 久久久免费精品视频| 亚洲一区在线看| 国产精品狠色婷| 亚洲视频免费在线| 亚洲精品日韩在线| 欧美高清在线播放| 亚洲日本aⅴ片在线观看香蕉| 久久综合色影院| 久久精品人人做人人爽| 国产色爱av资源综合区| 欧美一二三区在线观看| 亚洲午夜小视频| 国产精品免费视频xxxx| 亚洲欧美日韩一区二区| 中文日韩电影网站| 国产精品毛片在线| 欧美一区二区三区免费观看视频| 中文日韩在线| 国产精品亚洲综合久久| 欧美在线视频一区| 欧美一区二区三区播放老司机 | 久久精品国产亚洲a| 国产日本欧洲亚洲| 久久久五月天| 麻豆成人精品| 99国产精品一区| 亚洲视频福利|