Home Blog Page 13

[Tips] Scrum Process software development – What’s it?

What’s Scrum Process?

Scrum is an iterative and incremental agile software development framework for managing product development.
It defines “a flexible, holistic product development strategy where a development team works as a unit to reach a common goal”, challenges assumptions of the “traditional, sequential approach” to product development, and enables teams to self-organize by encouraging physical co-location or close online collaboration of all team members, as well as daily face-to-face communication among all team members and disciplines involved.
A key principle of Scrum is its recognition that during product development, the customers can change their minds about what they want and need (often called requirements volatility) , and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an evidence-based empirical approach-accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly, to respond to emerging requirements and to adapt to evolving technologies and changes in market conditions.

Scrum Process software development - What's it?

Roles

Product Owner

– The Product Owner represents the product’s stakeholders and the voice of the customer
– Focus on business side of product development and spend the majority of their time liaising with stakeholders and should not dictate how the team reaches a technical solution

Development Team

– Responsible for delivering potentially shippable increments (PSIs) of product at the end of each Sprint (the Sprint goal)
– The Development Team in Scrum is self-organizing, even though there may be some interaction with a projects management office (PMOs)

Scrum Master

– Scrum is facilitated by Scrum Master
– The Scrum Master is not a traditional team lead or project manager, but acts as a buffer between the team and any distracting influences.
– Ensures that scrum framework is followed
– Ensure the team follows the agreed processes in the Scrum framework, often facilitates key sessions and encourages the team to improve

Workflow

– A Sprint (or iteration) is the basic unit of development in Scrum.
– The Sprint is a timeboxed effort
– Each Sprint starts with a Sprint planning event that aims to define a Sprint Backlog, identify the work for the Sprint and make an estimated commitment for the Sprint goal

Planning

At the beginning of a Sprint, the Scrum Team holds a Sprint Planning event that:
– Communicates the scope of work likely during that Sprint
– Selects Product Backlog items that likely can be done
– Prepares the Sprint backlog that details the work needed to finish the selected Product backlog items
– Sets a four-hour time limit for Sprint Planning on a two-week Sprint
   + During the first half, the whole Scrum Team (Developement Team, Scrum Master and Product Owner) agree what Product Backlog Items to consider for that Sprint
   + During the second half, the Development Team decomposes the work items (tasks) required to deliver those product Backlog items, resulting in the Sprint Backlog.

Daily Scrum

– Each day during a Sprint, the team holds a Daily Scrum (or stand-up) with specific guidelines
– During the Daily Scrum, each team member answer three questions:
  + What did i do yesterday that helped the Development Team meet the Sprint goal?
  + What will I do today to help the Development Team meet the Sprint goal
  + Do I see any impediment that prevents me or the Development Team form meeting the Sprint goal

Review and retrospective

At the Sprint Review, the team
– Reviews the work that war completed and the planned work that was not completed
– Presents the completed work to the stakeholders

At the Sprint Retrospective, the team
– Reflects on the past Sprint
– Identifies and agrees on continuous process improvement actions

Scrum Process software development - What's it?

Sprint backlog

– The list of work the Development Team must address during the next Sprint

Scrum Process software development - What's it?

Sprint burn-down chart

– Sprint is a public displayed chart showing remaining work in the Sprint Backlog.
– Update every day, it gives a simple view of the Sprint process

Scrum Process software development - What's it?

Tinh chất của Scrum:

– Nhẹ nhàng
– Dễ hiểu
– Khó để tinh thông
Scrum không phải là một quy trình hay một kỹ thuật cụ thể để xây dựng sản phẩm. Nó là một khung làm việc cho phép bạn sử dụng nhiều quy trình trình và kỹ thuật khác nhau.
Scrum được xây dựng dựa trên lý thuyết quản lý tiến trình thực nghiệm gồm: Sự Minh Bạch (transparency), thanh tra (inspection) và thích nghi (adaptation).

Minh Bạch: (transparency)

– Hiển thị rõ rrách nhiệm với thành quả của tiến trình đó

Thanh Tra (inspection)

– Thường xuyên thanh tra và tiến độ đến đích để phát hiện các bất thường không theo ý muốn
– Tần suất không nên quá dày để khỏi ảnh hưởng đến công việc

Thích nghi (adaptation)

– Điều chỉnh lại khi scrum master xác định có vấn đề nào vượt qua giới hạn cho phép và hậu quả của vấn đề đối với sản phẩm là không thể chấp nhận được

Scrum cung cấp 4 phần sau:

1. Họp kế hoạch Sprint (Sprint planning Meeting)
2. Họp Scrum hằng ngày (Daily scrum)
3. Sơ kết Sprint (Sprint Review)
4. Họp cải tiến Sprint (Sprint Retrospective)


Nhóm Scrum:

Product Owner (chủ sản phẩm)

– Chịu trách nhiệm tối đa sản phẩm và công việc của nhóm phát triển.
– Chịu trách nhiệm về việc quản lý product backlog, công cụ quản l
1. Mô tả các hạng mục product backog
2. Trình tự của các hạng mục trong product backlog để đạt được mục đích và hoàn thành các nhiệm vụ
3. Đảm bảo cho product backlog là luôn hiện hữu, thông suốt và rõ ràng tới tất cả mọi người và chỉ ra những gì mà Nhóm Scrum sẽ làm việc
4. Đảm bảo giá trị của các công việc nhóm phát triển
5. Đảm bảo cho nhóm phát triển hiểu rõ các hạng mục trong Product backlog với các mức độ cần thiết

Nhóm phát triển (Development Team)

– Gồm các chuyên gia làm việc để cho ra các phần tăng trưởng có thể phát hành được (potentially releasable) cuối mỗi sprint.
– Họ có các đặc Trưng sau:
1. Nhóm tự tổ chức, không ai (bao gồm Scrum Master) có quyền yêu cầu nhóm phát triển làm thế nào để chuyển product backlog thành các phần tăng trưởng có thể chuyển giao được
2. Nhóm liên chức năng, với tất cả các kỹ năng cần thiết để tạo ra phần tăng trưởng sản phẩm
3. Có kỹ năng chuyên biệt và các chuyên môn đặc thù, nhưng họ phải chịu trách nhiệm dưới một thể thống nhất là nhóm phát triển
4. Nhóm phát triển không chứa các nhóm con nào khác với các chức năng đặc thù như ‘nhóm kiểm thử’ hay ‘phân tích nghiệp vụ’

Scrum Master

– Scrum Master chịu trách nhiệm đảm bảo mọi người hiểu và dùng được Scrum
– Scrum Master là một lãnh đạo, nhưng cũng là người phục vụ nhóm scrum. scrum master giúp đỡ những người ngoài nhóm scrum hiểu cách phải tương tác với nhóm sao cho hiệu quả nhất.
– Scrum Master giúp đỡ tất cả mọi người cải tiến các mối tương tác để tối đa hóa giá trị mà nhóm Scrum tạo ra
Câu hỏi:
1. Scrum Master giúp đỡ gì cho Product Owner?
– Tìm kiếm các kỹ thuật để quản lý hiệu quả Product Backlog
– Giao tiếp tích cực với nhóm phát triển về tầm nhìn, mục đích và các hạng của Product Backlog
– Huấn luyện cho nhóm Phát triển cách tạo ra các hạng mục Product backlog thật rõ ràng và đơn giản
– Hiểu rõ việc lập kế hoạch dài hạn sản phẩm trong môi trường thực nghiệm
2. Scrum Master phục vụ gì cho nhóm Phát Triển?
– Huấn luyện nhóm Phát triển cách tự tổ chức và làm việc cross-team
– Giúp đỡ nhóm tạo ra sản phẩm có giá trị cao
– Gỡ bỏ các khó khăn trong quá trình làm việc
– Huấn luyện nhóm hiểu rõ và ứng dụng đầy đủ về Scrum
3. Scrum Master phục vụ gì cho Tổ Chức?
– Lãnh đạo và huấn luyện tổ chức trong việc áp dụng Scrum
– Lập kế hoach
– Làm việc với các Scrum Master khác để gia tăng hiệu quả của việc áp dụng Scrum trong tổ chức của minh.
=> Các nhóm (self-organizing) và liên chức năng (cross-functional). Các nhóm tự quản tự mình chọn cách thức tốt nhất để hoàn thành công việc của họ, chứ không bị chỉ đạo bởi ai đó bên ngoài nhóm. Các nhóm liên chức năng có đủ kỹ năng cần thiết để hoàn thành công việc mà không phụ thuộc vào bất kỳ người nào khác.

Sự kiện Scrum

Sprint

– Trong suốt quá trình Sprint không cho phép bất kỳ sự thay đổi nào ảnh hưởng đến mục tiêu Sprint Goal
– Thành viên nhóm Phát triển được giữ nguyên
– Mục tiêu chất lượng không được cắt giảm
– Phạm vi có thể được làm rõ và tái thương lượng giữa Product Owner và Nhóm Phát triển

Họp kế hoạch Sprint

– Mục tiêu của Sprint là gì?
– Sprint này phải chuyển giao cho ai
– Làm sao để đạt được điều đó

Họp Scrum hằng ngày

– Tôi đã làm những gì kể từ hôm qua để giúp Nhóm phát triển đạt được mục tiêu Sprint
– Tôi sẽ làm những gì hôm nay để giúp Nhóm phát triển đạt mục tiêu Sprint
– Tôi có nhìn thấy vấn đề gì cản trở nhóm phát triển đạt mục tiêu Sprint?

Sơ Kết Sprint

– Product Owner xác nhận phần nào hoàn thành và phần nào chưa hoàn thành
– Nhóm phát triển thảo luận những điều thuận lợi trong Sprint vừa qua và những khó khăn mà nhóm đã trải qua, cách thức giải quyết các vấn đề đó
– Toàn nhóm thảo luận về những gì sẽ làm

Cải tiến Sprint

Mục đích

– Kiểm tra lại tất cả các yếu tố trong Sprint vừa diễn ra, từ con người, quy trình và công cụ
– Sắp xếp lại các hạng mục chủ chốt đã thực hiện tốt và cải tiến
– Tạo ra một kế hoạch để triển khai các cải tiến cách thức làm việc

Product Backlog

– Liệt kê các tính năng, chức năng, yêu cầu, cải thiện, vá lỗi cần thiết để làm nên sản phẩm trong tương lai

[C# Ebooks] Ebook Sharing

—————————
—- English ebook —-
—————————

C# Ebook Sharing
The book begins with an introduction to GDI+ and the basics of graphics programming in Windows. The core of the book is a hands-on guide to practical topics, including how to use Window Forms and optimize GDI+ performance. Chapters demonstrate how to develop real-world tools such-as GDI+ Painter, GDI+ Editor, ImageViewer and ImageAnimator. The Author provides extensive reusable sample code in C# throughout, and complete downloadable source code in C# and Visual Basic .NET is available online, as are color versions of screen shots from the book.

This source code focus on some real projects. It will be support you how to using CSharp programming language in your application!

This pdf book give you overview how to naming conventions with camelCase, PascalCase, … and talk about many features in CSharp language

This books focus on programmer who have good skill in C++ and want to learn C# as quickly as possible,

——————————–
—- Vietnamese ebook —-
——————————–

OOP in CSharp

Basic knowledge in CSharp
Three Chapters C# Ebook here

[Tips] How to optimize Mac OS X 10.10 Yosemite Faster on VMware

Today I’ll show you how to optimize Mac OS X 10.10.X Yosemite faster on VMware!
Watch and compare two below image (one is best performance and another is low performance)

Best performance

How to optimize Mac OS X 10.10 Yosemite Faster on VMware

Low performance

How to optimize Mac OS X 10.10 Yosemite Faster on VMware
When you finish setup MacOS in VMware in PC with below config, you’ll see the your PC get slow performance, 

Ram: 8GB
Number of Processors: 2

How to optimize Mac OS X 10.10 Yosemite Faster on VMware

Now let’s try this lib when you build in MacOS
Beamoff Tool.iso

How to optimize Mac OS X 10.10 Yosemite Faster on VMware

How to use beamoff.iso files!

Just add iso file to your ISO image file when stat up MacOS System.
Open  Edit and settings OS X, browse to beamoff.iso location files, then double click to beamoff.iso file -> setup it on your VMware

How to optimize Mac OS X 10.10 Yosemite Faster on VMware

Setup this beam off files (see below gif files)

How to optimize Mac OS X 10.10 Yosemite Faster on VMware
How to optimize Mac OS X 10.10 Yosemite Faster on VMware

Because this script don’t effect when you restart, so if you restart you should add this item to loginItems let its auto active when you start the MacOS in next time. You can do that by
Copy it to userlogin through System Prefrences

After it restart your Mas OS. Enjoy it 🙂

How to optimize Mac OS X 10.10 Yosemite Faster on VMware

How to optimize Mac OS X 10.10 Yosemite Faster on VMware

Have any feedback or questions, leave your comment we can discuss about it!
Zidane
http://learn-tech-tips.blogspot.com/

[Tips] How to share a folder between Mac OS X and Windows 7 through VMware software

Many people run Mac OS X in VMware but unfortunately they are unable to share the folder between their current operating system window 7/8 and the Mac OS. This tutorial show you how to share the folder between Mac OS and Windows operating system.
Below is a step-by-step tutorial that you can follow:

Note: I am using VMware version 11.0.0 and Mac OS 10.10 Yosemite version in this tutorial. 
You can download VMware from here
VMware WorkStation

Unlocker
(After setup VMware, run this files to unlock VMware work station on the window environment)

How to share a folder between Mac OS X and Windows 7 through VMware software

1st Step:

It’s important that you enable sharing settings in VMware first. To do this, go to Mac OS X virtual machine (I’m using Mac OS 10.10 Yosemite version) that you created, and click Edit virtual machine settings or you can choose Edit menu -> Preferences
Warning: sometime Port used by VMware Workstation Server is used for another process / application. Please reconfig (default port is 447 -> I Choose 18447 or 8447 let find your any free port in your pc)
Choose Shared VMs location by browse to your PC location! click OK

How to share a folder between Mac OS X and Windows 7 through VMware software

2nd Step:

Restart your virtual machine and click System Preferences in Mac OS

How to share a folder between Mac OS X and Windows 7 through VMware software
Make sure that you have enabled File sharing (This will enable folder sharing between host operating system and Mas OS)

3rd Step: 

In Mas OS, Click Go, then click Computer on top menu

How to share a folder between Mac OS X and Windows 7 through VMware software

If you don’t see your hard disk shared, please use ping on window command (cmd) ping its and you can see the effect.

REMEMBER

How to share a folder between Mac OS X and Windows 7 through VMware software
How to share a folder between Mac OS X and Windows 7 through VMware software

Thanks for continue support learntechtips blogs, wishes you all healthy, succeed, happy in the life!
Zidane
http://learn-tech-tips.blogspot.com/

[C++ EBooks] Ebook Sharing

C++ documents

C++ Ebook Sharing

————————————
——– English ebooks ——–
————————————

The goal of this book is to provide a focused examination of each of these topic, covering the essential information you need to fully exploit the power of the C++ language
Many of the topics in this book deserve a book in their own right. Because it is not possible, given the available space, to covert every aspect of some of these subjects, the chapters in this book explain only what is most necessary for you to gain a working understanding of the technologies they describe. Often, you will find that the information provided here is sufficient for your immediate nee. Even if that is not always the case, these chapters provide a useful foundation in these advanced issues that will allow you to quickly gain a more comprehensive understanding of them with further study.

 

This book focus on video games. This will help you step-by step create a basic to advanced video game

This book focus on understanding C++ programming language users, and we don’t need to tell you how to use loops and conditional statements in the code. What do you need to know is how visual C++ can help you with windows programming and maybe a reminder now and then those statements accomplish. And you want to get that information fast.
C-for-dummies is specifically designed to give you the information you need as quickly as possible so that you can get back to creating cool windows applications with Visual C++.

This book focus on software engineering best practices. At the heart of the book is our signature “live-code approach” – programming concepts are presented in the context of complete working programs, rather than in code snippets. Each C++ code example is accompanied by live sample executions, so you can see exactly what each program does when it’s tun on a computer.

You should read this book if you fit one of these categories:
– You know some C++ and some windows programming techniques and are new to visual C++. You will learn the product much more quickly than you would if you just tried writing programs
– You’ve been working with previous version of visual C++. Many times users learn one way to do things and end up overlooking some  of the newer productivity features.
– You’ve been working with Visual C++ 6 for a while and are beginning to suspect you’re doing things the hard way. Maybe you are.

This book works well for the beginning or expert programmer who wishes to start programming a windows application using MFC. A working knowledge of C is required. Because is is helpful to know some C++, Appendix C illustrates all the C++ concepts that you need to know for the examples in this book. I recommend that you review this appendix before into this book
If you are a beginner, you’ll start at the beginning with a simple program that creates a window. With each additional chapter, you learn how to add new features. Small example programs are used for the first half of the book. For these small example programs, you generate all of the  code yourself; you do not need to use compiler tools, such as AppWizard, to generates starter code. In later chapters, you migrate to using a compiler tool that generates starter code and learn how to add your application’s code to the starter code.
If you already have some familiarity with MFC, this book will help you to fill in “gaps”, such as learning how to code without using a compiler tool to generate starter code. If you have been coding with the tools, this book will help you to understand the “bones” of the code, without the extraneous lines of tool-generated code that can often obscure the logic of a program. Once you know the bones, you can enjoy a greater understanding and confidence in what you add and delete in order to make the application your own

Over the next 21 days, you will learn how to use the features that Microsoft has built into its C++ development environment to enable you to create very advanced applications for the Windows and NT platforms. When Microsoft’s developers first came up with the idea behind Visual C++, they decided to take their world class C++ compiler and create a development environment and set of tools that would enable developers to create Window applications with a level of ease and speed that was unheard of among C++ development environments
If you are new to C+, don’t worry, This book is for you 🙂

This books  focus on basic syntax in C++, all classes, API, how to use, …

—————————————–
——– Vietnamese ebooks ——–
—————————————–

[Tips] How to install window 7 to PC

This tutorials I guide for some friend who ask me how to install window 7 into personal computer and laptop. I am very thanks for him because he had been going with learntechtips blog for a long time.

Now, don’t waste your time, follow my instruction, you can easy to install window to your PC.

Required:

– Window 7 ultimate / home / business / enterprise DVD
– Read Write DVD reader box

Step 1: (important step)

You MUST config your BIOS in your PC read DVD first, when you input the disk, so your PC will be read it first, after that it can install your window

Step 2:

After BIOS config successfully. Now read the window 7 DVD and enter process install, watch the below pictures.

How to install window 7 to PC

Step 3: 

Starting window and make sure do that with below instruction

How to install window 7 to PCHow to install window 7 to PC
How to install window 7 to PC


Step 4:

How to install window 7 to PC

Choose your window 7 version, here I choose Professional, you can choose another, up to your window license which you have, you can install the window fit to you!

How to install window 7 to PC

How to install window 7 to PC

Step 5:

– Choose Upgrade if you want to update your window with some feature in below box -> This is only available when an existing version of window is running
– Choose Custom (advanced) if you wanna to Install a new version windows -> This does not keep old files

How to install window 7 to PC

Warning:

My Pc just have one hard disk so I see below picture same here, If you have more hard disk you will be see some hard disk show same as a list….

Be careful with your choose, because if you wrong choose, It’s will be erase all data…. You maybe lost a lots of data files, (please contact your administrator for more information)

How to install window 7 to PC

Step 6:
After format your disk, the last thing is you’ll waiting for window install completed

How to install window 7 to PC

Type your pc name and password if you wanna to protect it!

How to install window 7 to PC

How to install window 7 to PC

Step 7: Final step

Contact with microsoft and buy your window license. After Input your CD product key

How to install window 7 to PC

After active you should setup your new time fit to your location!

How to install window 7 to PC

Setup your network

How to install window 7 to PC

When you see below picture, Congratulation. You have finished to install your window! 😀

How to install window 7 to PC

Thanks for continue support learntechtips blogs, wishes you all healthy, succeed, happy in the life!
Zidane
http://learn-tech-tips.blogspot.com/

[Tips] How to fix Cross-thread problem with C# control (2/2) [Updated 2017-01-20]

Today I’ll show you how to fix cross-thread problem with the second way. This way is used with Invoke and BeginInvoke API. What is Invoke and BeginInvoke? let’s read below topics

First Let’s understanding the Thread and MultiThread and synchronous and asynchronous
Read here


What is Single Thread and MultiThread

Single Thread: 

If we have couple of tasks to be worked on and the current system provides a single thread which can work all those, then it takes one by one and process as

What is Single Thread and MultiThread

Here we can see that we have a thread (Thread 1) and four tasks to be completed. Thread starts processing one by one and completes all. (The order in which tasks will be taken up, does not affect the execution, we can have different algorithm which can define the priorities of tasks)

Multi-Thread:

What is Single Thread and MultiThread
Here we can see that we have four threads and same number of tasks to complete and each thread start working on that This is ideal scenario but in normal case, we used to have more number of tasks then number of available threads so whichever thread gets free takes up another task. As already said that spawning new thread is not an option every time because it requires system resources like CPU, memory and based on that number of threads should be decided.

Synchronous Single Threaded
Synchronous Multi-Threaded
Asynchronous Single Threaded
Asynchronous Multi-Threaded

What is Synchronous and Asynchronous

Synchronous

Synchrouous and Asynchronous

Example:
1. You are in a queue to get a movie ticket. You cannot get one until everybody in front of you gets one and the same applies to the people queued behind you
2. Ammunition in the gun: shot every ammunition one by one

Asynchronous

Synchrouous and Asynchronous

Example:
1. You are in restaurant with many other people. You order your food. Other people can also order their food. They don’t have to wait for your food to be cooked and served to you before they can order. In the kitchen, workers are continuously cooking, serving and taking orders. People will get their food servered as soon as it is cooked
2. About car traffic: the car can pass another car, no need to waiting the before car

———————————————

Many people are taught that multi-Threading and asynchrony are the same thing, but they are not.
An analogy usually helps/ You are cooking in a restaurant. An order comes in for eggs and toast.
Synchronous:: you cook the eggs, then you cook the toast
Asynchronous, single threaded: you start the eggs cooking and set a timer. You start the toast cooking, and set a timer. While they are both cooking, you clean the kitchen. When the timers go off you take the eggs off the heat and the toast out of the toaster and serve them.
Asynchronous, multi-Threaded: you hire two more cooks, one to cook eggs and one to cook toast. Now you have the problem of coordinating the cooks so that they do not conflict with each other in the kitchen when sharing resources. And you have to pay them.
Now does it make sense that multi-Threading is only one kind of asynchrony?
Threading is about workers; Asynchrony is about tasks.
In multi-Threaded workflows you assign tasks to workers. 
In asynchronous single-Threaded workflows you have a graph of tasks where some tasks depend on the results of others; as each task completes it invokes the code that schedules the next task that can run, given the results of the just-completed task. But you (hopefully) only need one worker to perform all the tasks, not one worker per task

Resource contention

– when running a application, the main is created, that’s call main-thread. if this have many thread doing the multi-task and the thread need use the resource from the main thread, if you try to access  resource from the main thread, you can get resource contention problem
– The Invoke is appeared at this time to help you lock the resource guaranteed the thread-safe and don’t make the problem is crashed by resource contention!
– Khi chạy một ứng dụng, có một thread được tạo ra để chạy hàm Main(). Đó là thread chính (main-thread). Nếu chương trình có nhiều thread thực hiện các tác vụ xử lý khác và các thread này cần sử dụng tài nguyên từ thread chính thì bạn phải cần tới Invoke. Thực ra, bạn có thể đặt thuộc tính CheckForIllegalCrossThreadCalls = false; cho form (hoặc control) và sử dụng các tài nguyên từ thread khác một cách thoải mái. Nhưng như vậy, chương trình sẽ rơi vào trạng thái ko an toàn (unsafe) và sẽ bị crash bất cứ lúc nào khi các thread tranh chấp tài nguyên với nhau.

– C# cung cấp 1 giải pháp an toàn hơn đó là Invoke. Khi bạn gọi phương thức này của một form (hoặc control) từ 1 thread khác, form (control) đó sẽ bị lock, chỉ cho phép thread đã gọi nó truy cập. Khi thread này hoàn thành tác vụ của nó, form (control) lại được giải phóng cho thread khác gọi. Như vậy, các thread sẽ được đồng bộ với nhau và chương trình của bạn sẽ ko bị crash. Đó gọi là thread-safe.

– Có những control ko yêu cầu Invoke để thực hiện thread-safe. Nghĩa là nó có thể được truy cập một cách trực tiếp không qua Invoke. Thuộc tính InvokeRequired sẽ cho biết một control có yêu cầu Invoke khi gọi hay không?

BeginInvoke and Invoke

BeginInvoke() will schedule the asynchronous action on the GUI thread. When the asynchronous action is scheduled, your code continues. Some time later (you don’t know exactly when) your asynchronous action will be executed

Invoke() will execute your asynchronous action (on the GUI thread) and wait until your action has completed. -> easy get deadlock but safe than BeginInvoke

Look at the below example:

Source code

Main.cs

private bool isProcessRunning = false;
private void Demo(object sender, EventArgs e)
{
listBox1.Items.Clear();

// If a process is already running, warn the user and cancel the operation
if (isProcessRunning)
{
MessageBox.Show("A process is already running.");
return;
}

// Initialize the thread that will handle the background process
Thread backgroundThread = new Thread(new ThreadStart(() => CallingThread()));

// Start the background process thread
backgroundThread.Start();
}

1st Example: 

single code: 
listBox1.Invoke(new Action(() => listBox1.Items.Add(lst[i])));

multi code: use { and }
listBox1.BeginInvoke(new Action(() =>
{
     listBox1.Items.Add(lst[i]))
});

We use Invoke in this case because we want to wait until the user action has completed.

// Developer: zidane / VịLH (huuvi168@gmail.com)
// Last modified: 2016-07-07
private void CallingThread()
{
toolStripProgressBar.ProgressBar.Invoke(new Action(() =>
toolStripProgressBar.Style = ProgressBarStyle.Marquee));

toolStripStatusLabel.Text = "Waiting for task ...";

// Set the flag that indicates if a process is currently running
isProcessRunning = true;

clsDBConnect clsDB = new clsDBConnect();
List<string> lst = clsDB.SelectQueryString();

// Thread.sleep(100); // remember set Thread.Sleep(1000) here

for (int i = 0; i < lst.Count; i++)
{
if (listBox1.InvokeRequired)
listBox1.Invoke(new Action(() => listBox1.Items.Add(lst[i])));
}

// Show a dialog box that confirms the process has completed
toolStripStatusLabel.Text = "Done";

// Reset the progress bar's value if it is still valid to do so
toolStripProgressBar.ProgressBar.Invoke(new Action(() =>
toolStripProgressBar.Style = ProgressBarStyle.Continuous));

// Reset the flag that indicates if a process is currently running
isProcessRunning = false;

}

2nd Example: 

listBox1.BeginInvoke(new Action(() => listBox1.Items.Add(lst[i])));

Shouldn’t use beginInvoke in this case, because it will crashed your program.

private void CallingThread()
{
toolStripProgressBar.ProgressBar.Invoke(new Action(() =>
toolStripProgressBar.Style = ProgressBarStyle.Marquee));

toolStripStatusLabel.Text = "Waiting for task ...";

// Set the flag that indicates if a process is currently running
isProcessRunning = true;

clsDBConnect clsDB = new clsDBConnect();
List<string> lst = clsDB.SelectQueryString();

for (int i = 0; i < lst.Count; i++)
{
if (listBox1.InvokeRequired)
listBox1.BeginInvoke(new Action(() => listBox1.Items.Add(lst[i])));
}

// Show a dialog box that confirms the process has completed
toolStripStatusLabel.Text = "Done";

// Reset the progress bar's value if it is still valid to do so
toolStripProgressBar.ProgressBar.Invoke(new Action(() =>
toolStripProgressBar.Style = ProgressBarStyle.Continuous));

// Reset the flag that indicates if a process is currently running
isProcessRunning = false;

}

Relative topic
http://learn-tech-tips.blogspot.com/2015/11/how-to-fix-cross-thread-problem-CSharp.html 

If you have any feedback, leave your comment, we can discuss about it!
Have a nice day!
Zidane
https://learn-tech-tips.blogspot.com/

[Tutorial] Design Pattern – Composite Pattern

“A tree structure of simple and composite objects”

The Composite composes objects into tree structures and lets clients treat individual objects and compositions uniformly. Although the example is abstract, arithmetic expressions are Composites. An arithmetic expression consists of an operand, an operator (+ – * /), and another operand. The operand can be a number, or another arithmetic expresssion. Thus, 2 + 3 and (2 + 3) + (4 * 6) are both valid expressions.

Design Pattern - Iterator Pattern

Rules of thumb

  • Composite and Decorator have similar structure diagrams, reflecting the fact that both rely on recursive composition to organize an open-ended number of objects.
  • Composite can be traversed with Iterator. Visitor can apply an operation over a Composite. Composite could use Chain of Responsibility to let components access global properties through their parent. It could also use Decorator to override these properties on parts of the composition. It could use Observer to tie one object structure to another and State to let a component change its behavior as its state changes.
  • Composite can let you compose a Mediator out of smaller pieces through recursive composition.
  • Decorator is designed to let you add responsibilities to objects without subclassing. Composite’s focus is not on embellishment but on representation. These intents are distinct but complementary. Consequently, Composite and Decorator are often used in concert.
  • Flyweight is often combined with Composite to implement shared leaf nodes.

Giám đốc điều hành của công ty GianDataPool, một công ty mà bạn mới chuyển đến với vị trí tư vấn, vừa đi khẽ vào phòng làm việc của bạn và nói lầm bầm gì đó.
“Gì vậy?” bạn hỏi.
Vị giám đốc nhìn quanh với vẻ mặt bí mật, và nói “Tôi có một dự án tuyệt mật dành cho bạn”
“Tuyệt mật?” bạn nói “Nó nói về cái gì?”
“Đừng to tiếng!” vị giám đốc nói khẽ. “Chúng ta cần một người khách quan cho chuyện này, Vì vậy tôi mới gặp anh. Chúng ta dường như đang gặp phải một số vấn đề với việc quản trị và chúng ta cần phải theo dõi các phó giám đốc – Không ai được biết việc này. Bây giờ, có thể có hai hay vài vị phó giám đốc làm việc như một lập trình viên vậy”
“Thừa thầy thiếu thợ”, bạn thở dài “Chuyện dài tập của các công ty”
“Chúng ta bắt đầu với khu vực bán hàng,” vị giám đốc nói khẽ “Anh có thể viết một chương trình duyệt qua hết hồ sơ và in chúng ra chứ?”
“Còn hơn thế nữa”, bạn nói. ”Tôi sẽ sử dụng mẫu Iterator”
Chương này nói về hai mẫu có quan hệ mật thiết với nhau: mẫu Iterator và mẫu Composite. Mẫu Iterator cung cấp cho bạn cách thức truy cập một bộ phận bên trong một đối tượng mà không cần phải hiểu rõ cấu trúc nội tại của đối tượng đó. Ví dụ, hãng Sun đã giới thiệu một kiểu tập hợp trong việc biểu diễn các mối quan hệ trong ngôn ngữ Java, những tập hợp này cho phép bạn tạo iterator – một đối tượng đặc biệt được thiết kế cho phép bạn truy cập một phần tử của tập hợp – để cung cấp một cách thức truy cập dễ dàng.
Mẫu Composite cũng nói về tập hợp. Với mẫu Composite, ý tưởng là bạn có thể một cấu trúc hình cây nơi mà từng đối tượng sẽ thuộc về một cái cây -là một nút lá không có nút con, hoặc là một nhánh cây với nhiều nút lá con – để có thể xử lý trong cùng một cách. Mẫu Composite được thiết kế cho phép bạn xử lý nhiều đối tượng khác chủng loại trong cùng một tập hợp theo cùng một cách, và một đối tượng lặp iterator lại vô tình phù hợp tại đây – dùng để xử lý  từng phần tử của một nhánh cây – ví dụ, bạn có thể duyệt qua hết cây. Chúng ta sẽ thảo luận về hai mẫu trong chương này.

Truy cập đối  tượng với mẫu Iterator

Khi bạn làm việc với một tập hợp nhiều đối tượng, mẫu Iterator là một giải pháp tốt. Hàng ngày, bạn phải làm việc với nhiều loại tập hợp như cấu trúc cây, cây nhị phân, mảng, vòng đệm, bảng băm, danh sách mảng và vân vân… Cách thức mà tập hợp này lưu trữ đối tượng của nó rất khác nhau, và nếu bạn muốn truy cập dữ liệu của những đối tượng này, bạn phải học những kỹ thuật khác nhau cho từng loại tập hợp.
Và đó là nơi mẫu Iterator xuất hiện. Bạn có thể sử dụng một giao diện interface được xác định rõ ràng để truy cập tới từng phần tử của tập hợp. Trong những năm qua, các phương pháp cơ bản đã dần trở nên thích hợp hơn, và chúng cũng xuất hiện xuyên suốt chương này. Sử dụng những phương pháp này, bạn có thể truy xuất tới các phần tử trong tập hợp theo cách cơ bản nhất.
Ghi nhớ: Theo sách của Gang of Four (Gof), bạn có thể sử dụng mẫu thiết kế Iterator để “Cung cấp một cách thức truy cập tuần tự tới các phần tử của một đối tượng tổng hợp, mà không cần phải tạo dựng riêng các phương pháp truy cập cho đối tượng tổng hợp này”
Nói cách khác, một Iterator được thiết kế cho phép bạn xử lý nhiều loại tập hợp khác nhau bằng cách truy cập những phần tử của tập hợp với cùng một phương pháp, cùng một cách thức định sẵn, mà không cần phải hiểu rõ về những chi tiết bên trong của những tập hợp này.
Gợi ý: Mẫu thiết kế Iterator đặc biệt quan trọng khi tập hợp bạn đang xây dựng được tạo thành từ những tập hợp con riêng rẽ, ví dụ khi bạn chỉnh sửa bảng băm với danh sách mảng, chẳng hạn.

Truy cập đối tượng của bạn với một Iterator

Bạn bắt đầu làm việc với rắc rối giám đốc, đó là phải theo dõi các phó giám đốc. Trong trường hợp này, bạn quyết định lưu các phó giám đốc vào trong một tập hợp, với một tập hợp các chức năng cho phép truy xuất các vị này. Trong phiên bản đầu tiên này, các chức năng cơ bản mà một Iterator phải có như sau:

was
first
next
isDone
curretnItem

next
hasNext
remove

Hàm next trả về phần tử kế tiếp trong tập hợp, hàm hasNext trả về giá trị True nếu vẫn còn phần tử trong tập hợp và trả về false trong trường hợp ngược lại, hàm remove cho phép bạn gỡ bỏ một phần tử trong tập hợp.
Đó là cách Iterator làm việc – Nó cung cấp một giao diện đơn giản, nhất quán để làm việc với các tập hợp khác nhau. Giả sử rằng khách hàng phải làm việc với một tập hợp phức tạp và rắc rối ( như hình sau) và không biết cách thức làm việc với nó như thế nào.

Design Pattern - Iterator Pattern

Khách hàng có thể sử dụng iterator để làm cầu nối với tập hợp, và khách hàng có thể sử dụng các phương thức cơ bản của Iterator để giao tiếp với tập hợp. Như hình sau:

Design Pattern - Iterator Pattern
Ghi nhớ: Sách của GoF nói rằng, bạn sử dụng mẫu Composites để “Tạo ra các đối tượng trong một cấu trúc hình cây để biểu diễn cho một cấu trúc phân cấp. Mẫu Composites cho phép khách hàng xử lý một đối tượng riêng hoặc toàn bộ đối tượng theo cùng một cách”
Đó là những gì bạn cần – một mẫu thiết kế cho phép bạn xử lý các nút lá hoặc các nhánh của cấu trúc cây theo cách giống nhau bởi vì bạn muốn có thể in ra thông tất cả các phó giám đốc riêng lẻ, trong một khu vực, hoặc cả công ty, chỉ bằng cách gọi hàm print.
Mẫu thiết kế Composites rất phù hợp với mẫu Iterator bởi vì khi bạn gọi từng khu vực để in chính nó, nó có thể dễ dàng duyệt qua từng phó giám đốc một. Đó là đặc điểm điển hình của mẫu Composite – khi bạn yêu cầu một nhánh thực hiện một hành động gì đó , nó sẽ lặp qua tất cả các lá con và nhánh con của nó.
Ý tưởng đằng sau của mẫu Composite là việc xử lý các nút lá và nhánh trong một cấu trúc hình cây sẽ giống nhau. Điều này giúp cho việc xử lý các cấu trúc phức tạp theo dạng hình cây sẽ dễ dàng hơn bởi vì bạn không cần phải thiết lập các hàm khác nhau cho từng phần của cấu trúc.
Để thực hiện mẫu Composite, sách của GoF khuyên rằng bạn nên sử một lớp trừu tượng như là một lớp cơ sở cho cả nút lá và các nhánh trong cấu trúc cây. Việc làm này giúp cho các nút lá và các nhánh sẽ có chung một tập hợp các hàm, đó là tất cả những gì mẫu Composite muốn nói tới.

Source code treeview

Design Pattern - Iterator Pattern

Result:

Design Pattern - Iterator Pattern

Ref:
https://haihth.wordpress.com/2013/02/23/dp-chapter8/
https://sourcemaking.com/design_patterns/composite

[Tutorial] Design Pattern – Flyweight Pattern

“A fine-grained instance used for efficient sharing”

The Flyweight uses sharing to support large numbers of objects efficiently. Modern web browsers use this technique to prevent loading same images twice. When browser loads a web page, it traverse through all images on that page. Browser loads all new images from Internet and places them the internal cache. For already loaded images, a flyweight object is created, which has some unique data like position within the page, but everything else is referenced to the cached one.
Design Pattern - Flyweight Pattern

Rules of thumb

  • Whereas Flyweight shows how to make lots of little objects, Facadeshows how to make a single object represent an entire subsystem.
  • Flyweight is often combined with Composite to implement shared leaf nodes.
  • Terminal symbols within Interpreter’s abstract syntax tree can be shared with Flyweight.
  • Flyweight explains when and how State objects can be shared.

    Mẫu ”hạng ruồi” flyweight giúp cho một đối tượng trông giống nhiều đối tượng.

    Mẫu singleton nói về việc tạo một đối tượng duy nhất. Có một mẫu thiết kế khác cũng hạn chế việc tạo đối tượng, nhưng lần này nó sẽ đem đến một cách thức khác trong việc viết mã. Đó là mẫu “hạng ruồi” flyweight.
    Mẫu thiết kế này gọi là “hạng ruồi” flyweight nguyên do thay vì phải làm việc với nhiều đối tượng độc lập, to lớn, bạn giảm bớt kích thước chúng bằng việc tạo một tập hợp các đối tượng dùng chung nhỏ hơn, gọi là flyweight mà bạn có thể cài đặt vào lúc thực thi chương trình để chúng trông giống như những đối tượng lớn hơn. Mỗi đối tượng to lớn có thể tiêu tốn nhiều tài nguyên hệ thống, bằng cách tách những điểm giống nhau của các đối tượng này, và dựa trên việc cấu hình thời gian thực để mô phỏng lại các đối tượng lớn, bạn đã làm giảm bớt gánh nặng lên tài nguyên hệ thống.
    Bạn có thể đem những phần riêng biệt ra khỏi mã nguồn của những đối tượng to lớn và tạo ra những đối tượng flyweight. Khi làm điều này, bạn đã chấm dứt việc sử dụng nhiều đối tượng có chung các đặc điểm, và giảm xuống việc chỉ sử dụng một đối tượng, có thể cài đặt khi chương trình thực thi, mô phỏng lại cả tập hợp các đối tượng to lớn ban đầu
    Ghi nhớ: Sách GoF đã định nghĩa mẫu flyweight như sau: “Sử dụng việc chia sẻ để giúp cho việc xử lý các đối tượng lớn một cách hiệu quả” Họ cũng nói rằng: “Một mẫu flyweight là một đối tượng chia sẻ mà có thể sử dụng trong đồng thời nhiều ngữ cảnh. Mẫu flyweight hoạt động như một đối tượng độc lập trong mỗi thời điểm.
    Đây là những gì diễn ra. Bạn bắt đầu với một tập hợp nhiều đối tượng to lớn trong mã nguồn. Bạn gỡ bỏ những phần dùng chung, đóng gói chúng vào một đối tượng chia sẻ, một flyweight, đối tượng này hoạt động như một khuôn mẫu. Đối tượng khuôn mẫu này có thể được cài đặt vào lúc thực thi chương trình bằng cách chuyển các đặc điểm dùng chung vào đối tượng flyweight để nó xuất hiện giống như một hay nhiều đối tượng lớn ban đầu. Bạn có thể thấy như hình vẽ sau:
    Design Pattern - Flyweight Pattern

    Từ những đối tượng to lớn, bạn tạo một đối tượng nhỏ hơn gọi là flyweight (trong ví dụ này là một flyweight, tùy nhiên tùy thuộc vào ứng dụng mà bạn có thể có nhiều flyweight), mà bạn có thể cài đặt vào lúc chương trình hoạt động như hình sau:

    Design Pattern - Flyweight Pattern

    Bất cứ khi nào bạn phải xử lý một lượng lớn các đối tượng, mẫu Flyweight sẽ xuất hiện trong tâm trí bạn. Nếu bạn có thể tách những nội dung giống nhau cần thiết từ những đối tượng này, và tạo một flyweight, hoặc nhiều flyweight, mà hoạt động giống những khuôn mẫu, thì đó chính là cách mẫu flyweight hoạt động
    Ví dụ rằng, ở cương vị một chuyên gia thiết kế mẫu, bạn được chọn để giảng dạy về mẫu thiết kế cho một lớp học. Chương trình mà bạn cần có để theo dõi hồ sơ học viên cho từng học viên có thể là những đối tượng thật sự lớn. Bạn quyết định đã đến lúc tiết kiệm tài nguyên hệ thống. Đó là công việc của mẫu Flyweight.

    Tạo một học viên

    Để tạo mã nguồn cho một đối tượng học viên, bạn quyết định cài đặt nó như một đối tượng Flyweight với tên Student. Đối tượng này được cấu hình sao cho trông giống nhiều học viên mà bạn muốn. Vì vậy bạn thêm vào các hàm thiết lập thông tin và trả thông tin, chẳng hạn tên học viên, mã số, và điểm.

    Bạn cùng có thể muốn so sánh học lực của các học viên với nhau, nên bạn thêm một hàm getStanding, có thể trả về mối tương quan của học lưc học viên và điểm trung bình . Mã như sau:

    public class cStudent {
            string _name;
            string _id;
            double _score;
            double _average;

            public double getStading()
            {
                return (double)((double)(_score / _average) - 1) * 100;
            }

            public double Score
            {
                get { return _score; }
                set { _score = value; }
            }

            public string Id
            {
                get { return _id; }
                set { _id = value; }
            }
          
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
         

            public cStudent(double averageScrore)
            {
                _average = averageScrore;
            }
        }

    Lưu ý rằng hàm getStanding sẽ trả về sự khác biệt phần trăm điểm số của sinh viên so với điểm trung bình.

    Chạy thử mẫu Flyweight

    Để sử dụng mẫu flyweight, bạn phải lưu trữ dữ liệu mà bạn muốn cấu hình cho flyweight. Trong trường hợp này bạn muốn cài đặt cho đối tượng Student giống như một tập hợp các học viên có thật, vì vậy bạn có thể lưu trữ dữ liệu sinh viên (như tên, mã số, điểm) bằng một dãy như sau:
    static void Main(string[] args)
            {
                string[] names = { "Zidane", "Mark", "Sophia" };
                string[] ids = {"1001", "1002", "1003"};
                double[] scores = { 27, 67, 45 };
                double total = 0;

                for (int i = 0; i < scores.Length; i++)
                    total += scores[i];

                double average = total / scores.Length;

                cStudent student = new cStudent(average);
                for (int i = 0; i < scores.Length; i++)
                {
                    student.Id = ids[i];
                    student.Name = names[i];
                    student.Score = scores[i];

                    Console.WriteLine("Name: " + student.Name);
                    Console.WriteLine("ID: " + student.Id);
                Console.WriteLine("Standing: " + Math.Round(student.getStading()));
                    Console.WriteLine(" ------------------------ ");                   
                }

                Console.ReadLine();

      }

    Thay vì sử dụng ba đối tượng đầy đủ, bạn chỉ cần sử dụng một đối tượng. Cũng gần giống mẫu Singleton, tuy nhiên ý tưởng đằng sau mẫu Flyweight là kiểm soát việc tạo dựng đối tượng, và số lượng đối tượng theo ý bạn muốn.

    Ref
    https://sourcemaking.com/design_patterns/flyweight
    https://haihth.wordpress.com/2013/02/23/dp-chapter5/

    [Tutorial] Design Pattern – Facade Pattern

    ” A single class that represents an entire subsystem”

    The Facade defines a unified, higher level interface to a subsystem that makes it easier to use. Consumers encounter a Facade when ordering from a catalog. The consumer calls one number and speaks with a customer service representative. The customer service representative acts as a Facade, providing an interface to the order fulfillment department, the billing department, and the shipping department.

    Design Pattern - Facade Pattern

    Rules of thumb

    • Facade defines a new interface, whereas Adapter uses an old interface. Remember that Adapter makes two existing interfaces work together as opposed to defining an entirely new one.
    • Whereas Flyweight shows how to make lots of little objects, Facade shows how to make a single object represent an entire subsystem.
    • Mediator is similar to Facade in that it abstracts functionality of existing classes. Mediator abstracts/centralizes arbitrary communications between colleague objects. It routinely “adds value”, and it is known/referenced by the colleague objects. In contrast, Facade defines a simpler interface to a subsystem, it doesn’t add new functionality, and it is not known by the subsystem classes.
    • Abstract Factory can be used as an alternative to Facade to hide platform-specific classes.
    • Facade objects are often Singletons because only one Facade object is required.
    • Adapter and Facade are both wrappers; but they are different kinds of wrappers. The intent of Facade is to produce a simpler interface, and the intent of Adapter is to design to an existing interface. While Facade routinely wraps multiple objects and Adapter wraps a single object; Facade could front-end a single complex object and Adapter could wrap several legacy objects.
    Question: So the way to tell the difference between the Adapter pattern and the Facade pattern is that the Adapter wraps one class and the Facade may represent many classes?
    Answer: No! Remember, the Adapter pattern changes the interface of one or more classes into one interface that a client is expecting. While most textbook examples show the adapter adapting one class, you may need to adapt many classes to provide the interface a client is coded to. Likewise, a Facade may provide a simplified interface to a single class with a very complex interface. The difference between the two is not in terms of how many classes they “wrap”, it is in their intent.

    ĐƠN GIẢN HÓA CUỘC SỐNG VỚI MẪU FACADE

    Một mẫu thiết kế tương tự với mẫu Adapter là mẫu Façade. Hai mẫu này làm việc theo cùng một cách, nhưng mục đích sử dụng của chúng khác nhau. Mẫu adapter chuyển đổi mã nguồn để làm việc được với mã nguồn khác. Nhưng mẫu Façade cho phép bạn bao bọc mã nguồn gốc để nó có thể giao tiếp với mã nguồn khác dễ dàng hơn.
    Ví dụ như, có một người thiết kế ra một cái máy in, và đưa cho bạn một cách tự hào. “Làm sao để máy có thể in?” bạn hỏi
    “Đầu tiên,” anh ta nói với bạn, “gọi hàm khởi động.”
    “Được” bạn nói. “Bây giờ nó in chưa?”
    “Chưa, bạn phải gọi turnFanOn”
    “OK, giờ nó sẽ in chứ”, bạn hỏi
    “Chưa, hãy gọi hàm làm nóng máy warmUp”
    “Được rồi. Giờ nó sẽ in, phải không?”
    “Vẫn chưa. Bạn phải gọi hàm getData để đưa dữ liệu từ máy vi tính tới máy in”
    “OK, hàm getData. Còn gì nữa không?”
    “Hàm định dạng dữ liệu formatData”
    “Và gì nữa?”
    “Hàm kiểm tra đầu mực checkToner, hàm kiểm tra giấy checkPaperSupply, hàm kiểm tra hệ thống runInternalDiagnostic, hàm …”
    “Khoan đã”, bạn nói, vậy viết cho tôi một hàm đại diện façade cho tất cả cái đống lộn xộn này. Hàm façade này sẽ gọi tất cả các hàm khác bên trong nó, và đơn giản hóa một cách đáng kể việc giao tiếp. “Chỉ vậy thôi”
    “Đó là cái gì?”, người thiết kế máy in hỏi
    “Hàm in ấn print”, bạn nói. “Chỉ cần gọi hàm in ấn print, và máy in hoạt động. Không cần làm gì khác.”
    “Hey”, anh ta nói “đó có thể là một ý tưởng tuyệt vời. Bây giờ bạn có thể thêm một hàm prepareToCallThePrintMethod , một hàm callThePrintMethod, một hàm cleanupAfterPrinting, một hàm…”
    “Anh đúng là hết thuốc chữa” bạn nói.
    Mẫu thiết kế Façade tạo ra một giao diện OOP dễ dàng để sử dụng. Nó là một vấn đề thiết kế cơ bản – nếu một đối tượng hay một lớp quá khó để giao tiếp, mẫu Façade tạo ra cho bạn một giao diện để giao tiếp dễ dàng hơn. Đây là định nghĩa chính thức của GoF về mẫu Façade: “Cung cấp một giao tiếp duy nhất cho tập hợp các giao tiếp của hệ thống. Façade định nghĩa một giao tiếp cao hơn để giúp các hệ thống con dễ dàng sử dụng”
    Thông thường, bạn sử dụng mẫu Façade khi bạn làm việc với những mã nguồn đã được đóng gói một cách cẩu thả. Không phải ai cũng là một chuyên gia OOP, và bạn cũng nhanh chóng thấy được rằng, khi bạn làm việc trong một môi trường phát triển phần mềm thương mại rộng lớn. Khi bạn trở nên mệt mỏi để giao tiếp với những giao diện được thiết kế rắc rối và nhận thấy rằng, bạn nhận được x,y thay vì một cái z đơn giản hơn. Đó là lúc bạn nên sử dụng một giao diện mới.
    Ý tưởng rất đơn giản; một façade làm đơn giản hóa một giao tiếp interface (sử dụng nghĩa chung của từ “interface”, không phải giao diện interface trong Java) giữa một lớp hay một đối tượng.
    Design Pattern - Facade Pattern
    Bạn thường sử dụng mẫu thiết kế Façade khi bạn muốn mã nguồn đơn giản hơn nhưng lại không thể chỉnh sửa mã nguồn cũ. Thông qua việc sử dụng mẫu Façade bạn có thể giải quyết vấn đề, nó thêm vào một lớp khác bên trên, và nếu mã nguồn của lớp bên dưới thay đổi, bạn cũng phải thay đổi luôn mã nguồn của mẫu Façade.

    Có một định nghĩa OOP làm việc ở đây, đôi khi còn được gọi là “Nguyên tắc về sự hiểu biết ít nhất” , đôi lúc được gọi là “Luật của Demeter” , đôi khi được gọi là “sự đóng gói hiệu quả”. Đây là ý tưởng nâng cao sự hiệu quả của OOP, bạn không muốn những thực thể riêng biệt (lớp hay đối tượng) phải biết quá nhiều về nhau. Càng ít càng tốt, bạn có thể che dấu chi tiết của từng lớp hay đối tượng và làm cho sự liên kết của chúng lỏng lẻo càng nhiều càng tốt. (Xem chương bốn để bíêt thêm về “tháo lỏng các mối liên kết” loose coupling) . Nếu một đối tượng cấn phải biết quá nhiều về đối tượng khác, đó chính là lúc cần sử dụng mẫu Façade.

    Ghi chú: Hãy tháo lỏng các mối liên kết càng nhiều càng tốt.

    Làm việc với một đối tượng khó khăn

    Đây là một ví dụ minh họa cách thức mẫu Façade làm việc. Công ty bạn vừa mua một công ty đối thủ, người quản lý đang rất hân hoan.

    “Hmm” bạn nói “ Chúng ta đang gặp rắc rối với vấn đề tương thích?. Sản phẩm của họ quá khác biệt với chúng ta”

    “Phi lý”, Ông chủ lớn nói “Mọi việc không thể đơn giản hơn”

    “Được,” bạn nói “Làm sao ông có thể đặt tên cho nó”

    “Không thể đơn giản hơn. Cứ gọi hàm setFirstNameCharacter. Nó sẽ đặt kí tự đầu cho tên”
    “OK, vậy kí tự thứ hai của tên thì sao?”

    “Chỉ cần gọi hàm setSecondNameCharacter. Không thể đơn giản hơn”

    “OK, để tôi tiếp tục.” bạn nói ”Vậy để đặt tên cho một sản phẩm, ông gọi hàm setFirstNameCharacter để thíêt lập kí tự đầu tiên cho tên, sau đó gọi hàm setSecondNameCharacter để thiết lập kí tự thứ hai, và bằng cách đó ông tiếp tục gọi hàm setFiveMillionNameCharacter để thiết lập kí thứ thứ năm triệu cho tên?”

    “Không”, Ông chủ lớn nói “Bạn chỉ có thể đặt tên với bảy kí tự”

    “À,” bạn nói “Không thể đơn giản hơn”

    “Đúng”, ông chủ nói

    Đây là đoạn mã, sau khi bạn hợp nhất với sản phẩm của công ty mới,

    Ref
    https://sourcemaking.com/design_patterns/facade

    https://haihth.wordpress.com/2013/02/23/dp-chapter6/