Tải bản đầy đủ (.doc) (20 trang)

Các mô hình lập trình tiên tiến

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (569.61 KB, 20 trang )

Các mô hình lập trình tiên tiến
Học viên: THY
Lớp: CH10CNT3
Bài tập: số 1
Mục lục:
Câu 1: Lập trình đồng thời (concurrence) là gì? Vì sao cần đến lập trình đồng thời trong các hệ phân
tán? Chạy ví dụ số Fibonacci và giải thích tính đồng thời trong ví dụ trong tài liệu tham khảo [1]..............3
Trả lời:......................................................................................................................................................3
Định nghĩa:...........................................................................................................................................3
Vì sao cần lập trình đồng thời trong hệ phân tán:...............................................................................3
Giải thích:.............................................................................................................................................6
Câu 2: Lập trình component là gì? Ích lợi của lập trình component? Các công nghệ component? Tham
khảo [1]........................................................................................................................................................6
Trả lời:......................................................................................................................................................6
Định nghĩa:...........................................................................................................................................6
Các lợi ích của lập trình component:....................................................................................................7
Các công nghệ component:.................................................................................................................8
Câu 3: Mô hình component trong eBay. Tham khảo [2]..............................................................................8
Trả lời:......................................................................................................................................................8
Câu 4: RMI là gì? Cách tiến hành cài đặt RMI. Cài đặt ví dụ HelloWorld trong tài liệu [3] và giải thích......11
Trả lời:....................................................................................................................................................11
Định nghĩa:.........................................................................................................................................11
Cách tiến hành cài đặt RMI................................................................................................................12
HelloWorld Example..........................................................................................................................14
Câu 5: Đọc bài “Teach Yourself Programming in Ten Years.pdf” và viết 1 trang với bài này.....................18
1


Trả lời.....................................................................................................................................................18

2




Câu 1: Lập trình đồng thời (concurrence) là gì? Vì sao cần
đến lập trình đồng thời trong các hệ phân tán? Chạy ví dụ
số Fibonacci và giải thích tính đồng thời trong ví dụ trong
tài liệu tham khảo [1]
Trả lời:
Định nghĩa:
Trong lập trình đồng thời, vài luồng hoạt động có thể thực hiện cùng 1 lúc. Mỗi
luồng thực hiện như khi nó hoạt động trong 1 chương trình tuần tự ngoại trừ khi
nó cần giao tiếp hoặc tương tác với luồng khác. Mỗi chuỗi lệnh được gọi là 1
thread. Chương trình tuần tự được gọi là đơn luồng. Khi một chương trình đa
luồng thực hiện, các hoạt động trong các luồng khác nhau được chèn theo thứ tự
không thể biết trước tùy thuộc vào các ràng buộc được đưa ra bởi các hoạt động
đồng bộ rõ rang mà có thể được nhúng trong code. Các hoạt động cho mỗi luồng
theo thứ tự một cách chặt chẽ nhưng sự đan xen của các hoạt động từ một tập các
luồng là chưa xác định và phụ thuộc vào hàng loạt sự thực hiện của chương trình.
Mỗi luồng có thể chạy rất nhanh trong khi những luồng khác không chạy.
Có thể nói lập trình đồng thời là một chương trình mà chứa các hoạt động đồng bộ
mà được làm đồng bộ tại một hoặc nhiều điểm hoặc tại một hoặc nhiều tài nguyên
suốt quá trình thực thi.
Vì sao cần lập trình đồng thời trong hệ phân tán:
Các hệ thống phân tán chạy được phân tán nhiều nơi, trên nhiều máy với tài
nguyên lớn và một lúc có thể chạy nhiều ứng dụng. Vì thế các ứng dụng này nên
được chạy đồng thời để tiết kiệm thời gian và tài nguyên.
Sau đây là ví dụ:

import java.awt.*;
import java.awt.event.*;


3


public class Fibonacci {
private static boolean stopProgram = false;
public static void main(String argv[]) {
Frame myFrame = new Frame("Calculate Fibonacci Numbers");
List myList = new List(4);
myFrame.add(myList, BorderLayout.CENTER);
Button b1 = new Button("Stop Calculation");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stopProgram = true;
}
});

Button b2 = new Button("Exit");
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});

Panel p1 = new Panel();
p1.add(b1);
p1.add(b2);
myFrame.add(p1, BorderLayout.SOUTH);
myFrame.setSize(200, 300);
myFrame.show();
4



int counter = 2;
while (true) {
if (stopProgram)
break;
counter += 1;
myList.add("Num
fibonacci(counter));

=

"

+

counter

+

"Fib

=

"

+

myFrame.show();
}


//Note: stopProgram cannot change value to true in the above
//loop. How does the program get to this point?
myList.add("Program Done");
}

public static int fibonacci(int NI) {
if (NI <= 1)
return 1;
return fibonacci(NI - 1) + fibonacci(NI - 2);
}

}

5


Giải thích:
Ở ví dụ trên, việc tính số Fibonacci là tự động trong 1 vòng lặp. Và có vẻ như biến
stopProgram không thể đặt thành false để dừng chương trình. Tuy nhiên khi
button stop được nhấn thì chương trình cũng dừng.

Đó là bởi vì biến stopProgram có thể thay đổi giá trị từ bên ngoài. Kỹ thuật này
cho phép các giá trị thay đổi đồng thời. Ở ví dụ này, chương trình chạy ẩn đối với
người lập trình. Một thread riêng rẽ là GUI thread đã được bắt đầu. Thread này
luôn luôn được chạy bởi java mọi lúc và đợi sự kiện click button stop button
calculator. Khi button này được click, GUI thread sẽ chạy trong một phần thời gian
và đồng thời cùng với main thread và đặt biến stopProgram thành true.

Câu 2: Lập trình component là gì? Ích lợi của lập trình

component? Các công nghệ component? Tham khảo [1]
Trả lời:
Định nghĩa:
Một cách nhìn thú vị tới lập trình đồng thời là nghĩ nó chứa 2 loại: hoạt động và
thực thể. Các hoạt động là hoạt động trên các thực thể hoặc các thực thể điều khiển
6


các hoạt động. Nếu tất cả các đơn vị là object thì trong 1 chương trình đồng thời,
tất cả object trong chương trình đó hoặc là chủ động (các hoạt động đồng thời như
thread) hoặc bị động (như chia sẻ tài nguyên hoặc sự kiện được dung đồng bộ).
Những kiểu đơn giản, các object không đồng bộ được dung bởi object chủ động
hoặc bị động.
Các object bị động, được gọi như những thành phần đơn giản. Nó cung cấp cơ sở
hạ tầng cho các hoạt động đồng bộ mà thực hiện trong 1 chương trình đồng bộ.
Thực chất lập trình hướng thành phần là nhấn mạnh vào sự chia tách mối quan hệ
của các chức năng có sẵn trên diện rộng trong cả hệ thống phần mềm. Các thành
phần có thể sử dụng trong nhiều dịch vụ và kế thừa các thành phần cơ bản khác.
Trong mỗi thành phần có code (mã) và data. Để code và data nhóm trong một
thành phần thì chúng phải gắn kết với nhau và sẽ được bảo vệ đối với những thành
phần khác.Các thành phần này có inteface để các thành phần hoặc hệ thống khác
có thể gọi đến.
Các lợi ích của lập trình component:
- Dễ sử dụng lại. Mỗi thành phần có thể được phát triển riêng biệt và sử dụng
cho nhiều ứng dụng. Sau đó có thể sử dụng lại cho nhiều ứng dụng khác
nhau và phát triển thêm.
- Dễ bảo trì. Vì mỗi thành phần là riêng biệt và sự ảnh hưởng là ít.
- Có khả năng phân tán và lập trình đồng thời. Các thành phần có thể đặt ở
nhiều nơi, gọi tới nhau thông qua inteface và chạy đồng thời với nhau.
- Các thành phần có thể phối hợp với nhiều thread, chúng có thể tạo hoặc tự

tạo các thread đơn lẻ.
- Các thành phần có thể dùng trong các hoạt động đồng bộ riêng lẻ, và trong
các trường hợp của tính toán phân tán hoặc trên các máy tính vật lý khác
nhau, một vài kỹ thuật được cài đặt để cho phép các thành phần giao tiếp với
những hoạt động đồng bộ. Các object khác nhau cho các hoạt động đồng bộ,
có thể thiết kế dùng luồng thủ tục, logic trong 1 component được tổ chức
khái quát xung quanh trạng thái của component khi nó thực hiện. Một vài kỹ
7


thuật cần thiết kế để thực thi các thành phần cho phép chúng cung cấp những
điều kiên này.

Các công nghệ component:
- RMI
- Common Object Request Broker (CORBA)
- Enterprise Java Beans (EJB)

Câu 3: Mô hình component trong eBay. Tham khảo [2]
Trả lời:
Ebay là một nền tảng thương mại điện tử thành công lớn. Ebay là một hệ thống
thương mại điện tử mà người dùng có thể truy xuất tới website .com của ebay và
tìm kiếm mọi thứ họ muốn mua, hoặc đấu giá với người mua hoặc đưa lên các sản
phẩm mà họ muốn chia sẻ với những người mua hiện tại và sau đó. Sau đó người
dùng thanh toán trực tuyến dựa vào hệ thống paypal – là hệ thống được thiết kế
nhằm mục đích thanh toán trực tuyến dựa trên nền tảng của ebay, và nhận hàng hóa
qua thư. Giống như các hệ thống kinh doanh có thể trực tuyến khác, eBay được
xây dựng dựa trên công nghệ phân tán. Nó yêu cầu khả năng mở rộng, tốc độ cao,
sẵn dùng cao và bảo mật. Nó cần điều khiển một số lượng lớn các request được
sinh ra bởi giao tiếp trên mạng và có thể đáp ứng từng ấy request trong 1 khọag

thời gian cho phép. Ebay còn cung cấp nhiều API cho nhà phát triển để tạo các ứng
dụng truy xuất vào eBay. Dưới đây là các dịch vụ do Ebay cung cấp:

Kiến trúc của eBay có thể được lặp lại nhiều lần. Một giải pháp kiến trúc là không
chỉ dựa vào kiến trúc phần mềm mà còn dựa vào kiến trúc hệ thống, từ các thành
phần mà có thể cắm vào không chỉ là web server, web client mà còn là db, security
8


server, application servr, proxy server, và transaction server. Hệ thống được đưa ra
với 3 tầng: thiết bị có khả năng duyệt web, application và transaction server,
database tại tầng dịch vụ dữ liệu. Dưới đây là biểu đồ tường minh cho vấn đề này:

Như vậy, eBay dựa trên mô hình component. Các component được dùng: Web
servers, Web clients, databases, security servers, application servers, proxy servers,
transaction servers.

9


Giữa các thành phần này có sự tương tác theo sơ đồ trên. Mỗi thành phần có các
thuộc tính chính:
Web browsers for Modifiability: Người dùng có thể tương tác với website thông
qua 1 trình duyệt web, thông qua HTML. Web browers hỗ trợ giao diện người
dùng có thể tùy chỉnh trong nhiều cách.
HTTPS for Security: Khi người dùng gửi một request, thì trình duyể sẽ chuyển
các thông tin đó tới 1 website đích. Sự chuyển giao này mang nhiều thông tin của
người dùng như credit card, và HTTPS được dùng cho mục đích đảm bảo an toàn
cho những phiên giao dịch này. HTTPS sử dụng secure sockets layer như một giao
thức con trên nền HTTP. Ở mức này sẽ thựuc hiện mã hóa đối vớii các thông tin

10


được gửi đi. Hệ thống parallel của eBay cung cấp một giao dịch an toàn thông qua
tài khoản ngân hàng của user.
Proxy servers for Performance: Request từ các trình duyệt riêng lẻ đầu tiên đc
đưa tới 1 proxy server, để cải thiện tốc độ của hệ thống. Proxy server lưu trữ các
thông tin mà user có thể nhận đc mà không cần truy cập tới web site chính.
Load balancing for Performance, Scalability, and Availability: hỗ trợ
hiệu suất, khả năng mở rộng, và khả
Web Servers for Performance: Đa luồng, xử lý và respond lại với các request
Application servers for Modifiability, Performance, and Scalability: Cài đặt
các logic nghiệp vụ, kết nối với client và server. Chúng cho phép cơ sở dữ liệu tập
trung vào lưu trữ, thu hồi và phân tích dữ liệu mà không cần quan tâm dữ liệu được
sử dụng thế nào.
Databases for Performance, Scalability, and Availability: Các request, điểm
đến cuối cùng là chuyển đến truy xuất vào cơ sở dữ liệu để lấy ra hoặc bổ sung,
sửa đổi data.

Câu 4: RMI là gì? Cách tiến hành cài đặt RMI. Cài đặt ví dụ
HelloWorld trong tài liệu [3] và giải thích.
Trả lời:
Định nghĩa:
RMI là viết tắt của remote method invoke - triệu gọi phương thức từ xa. RMI cung
cấp hỗ trợ cho các object phân tán trong java, ví dụ một object có thể gọi một
method của một object khác từ xa. Object đang gọi có thể dung cú pháp tương tự
như đang gọi một method địa phương.
Mô hình java RMI có 2 yêu cầu chung. Một là mô hình RMI đơn giản và dễ sử
dụng. Và thứ 2, mô hình RMI phải phù hợp với ngôn ngữ java trong một cách tự
nhiên.


11


Cách tiến hành cài đặt RMI
Một ứng dụng RMI thường có 2 chương trình: Client và server. Server tạo các
method từ xa và tạo các tham chiếu để có thể truy cập. Sau đó nó sẽ đợi client gọi
tới các method này. Clients có các tham chiếu từ xa để truy cập vào các object trên
server và gọi các method từ các object này.
Mô hình RMI cung cấp một ứng dụng object phân tán tới lập trình viên. Nó là một
kỹ thuật mà server và client dung để giao tiếp và truyền thông tin giữa các object.
Một ứng dụng object phân tán sẽ có các đặc điểm:
- Xác định object từ xa: Hệ thống phải chứa các tham chiếu tới các object từ
xa. Có thể làm bằng 2 cách: Dùng rmiregiter để đặt tên hoặc bởi việc chuyển
hoặc trả lại các object từ xa.
- Giao tiếp với các object từ xa: LTV không phải điều khiển việc giao tiếp này
vì RMi sẽ làm công việc đó. Việc gọi method từ xa giống như gọi cá method
địa phương.
- Load các file class bytecode cho các object mà chuyển như một tham số
hoặc trả về một giá trị.
Các bước tiến hành có thể nói như sau:
Phía serever
- Tạo file inteface
- Tạo lớp implements cài đặt các dịch vụ ở phía máy chủ: Các bước có thể
tham khảo img:
- Cài đặt server. (có thể chung với bước trên nếu là ví dụ đơn giản)
- Biên dịch
Phía client
- Copy lại file inteface.class nếu đặt ở thư mục khác
- Tạo ứng dụng client

12


- Biên dịch
Quá trình thực thi:
Bước 1: Tạo file stub hoặc skeleton:
rmic HelloWorldServer
Bước 2: Chia file vào các thư mục, file _stub phía lient và file _ske là phía server
Bước 3: Khởi động rmiregistry
Bước 4: Khởi động server
Bước 5: Chạy ứng dụng client

13


HelloWorld Example
Cách tiến hành cài đặt một ứng dụng RMI, ở đây chỉ ra đối với ví dụ helloword
Đây là một hệ thống RMI đơn giản với client và server. Server chứa một method là
helloword trả về một string cho client. Để xây dựng hệ thống RMI thì tất cả cá file
phải được build. Sau đó sẽ tạo ra stub và skeleton là những kỹ thuật cơ bản giao
tiếp với đối tượng từ xa được tạo ra bằng rmic compiler.
RMI có các file sau:
- HelloWord.java
- HelloWordClient.java
- HelloWordServer.java
Sau khi các file đã được build, thực hiện câu lệnh sau đây để tạo ra stub và
skeleton.
rmic HelloWorldServer
Sau đó 2 class đc tạo ra là HelloWordServer_stub.class và
HelloWordServer_Skel.class. File đầu tiên sẽ đặt phía client và file thứ 2 đặt

phía server.
Source code:

File inteface:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloWorld extends Remote {
String helloWorld() throws RemoteException;
}

14


Server:
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;

/*
Classname: HelloWorldServer
Purpose: The RMI server.
*/
public class HelloWorldServer extends UnicastRemoteObject implements
HelloWorld {

public HelloWorldServer() throws RemoteException {
super();
}


public String helloWorld() {
System.out.println("Invocation
succesful!");

to

return "Hello World from RMI server!";
}

public static void main(String args[]) {

try {
15

helloWorld

was


// Create an object of the HelloWorldServer class.
HelloWorldServer obj = new HelloWorldServer();

//

Bind

this

object


instance

to

the

name

"HelloServer".
Naming.rebind("HelloWorld", obj);

System.out.println("HelloWorld bound in registry");
}

catch (Exception e) {
System.out.println("HelloWorldServer
e.getMessage());
e.printStackTrace();
}
}
}

Client:

import java.rmi.Naming;
import java.rmi.RemoteException;

/*
Classname: HelloWorldClient
Comment: The RMI client.

*/
public class HelloWorldClient {
16

error:

"

+


static String message = "blank";

// The HelloWorld object "obj" is the identifier that is
// used to refer to the remote object that implements
// the HelloWorld interface.

static HelloWorld obj = null;

public static void main(String args[]) {
try {
obj = (HelloWorld) Naming.lookup("//" +
"kvist.cs.umu.se"
+ "/HelloWorld");

message = obj.helloWorld();

System.out.println("Message from the RMI-server
was: \"" + message
+ "\"");

}

catch (Exception e) {
System.out.println("HelloWorldClient exception: " +
e.getMessage());
e.printStackTrace();
}
}
17


}

Kết quả:

Câu 5: Đọc bài “Teach Yourself Programming in Ten
Years.pdf” và viết 1 trang với bài này.
Trả lời
Bất kỳ một ai muốn thành công đều phải học. Và để có được thành công, là một
quá trình nỗ lực, tập luyện không ngừng nghỉ của từng cá nhân trong một thời gian
dài. Việc lập trình cũng thế. Nếu nói chỉ học lập trình thành thạo trong 3 ngày thì là
đều không tưởng. Bởi vì, với 3 ngày, không thể đủ để viết đc 1 chương trình quan
trọng, học được từ những thành công và thất bại từ những chương trình ấy. Sẽ
không có đủ thời gian để làm việc như một lập trình viên kinh nghiệm và hiểu
được ý nghĩa như sống trong môi trường C++. Nói chung là không đủ thời gian để
18


học. Với 3 ngày, chỉ là mức kiến thức nông cạn, thiếu sâu sắc. Và đó thật sự là điều
nguy hiểm.

Trong 3 ngày bạn có thể học được cú pháp C++ hoặc học cách lập trình theo phong
cách C++ nhưng không thể hiểu được điểm hay, điểm mạnh của C++. Bạn không
thể học đc cách dùng ngôn ngữ. Bạn cần biết rằng, một ngôn ngữ nào đó không
ảnh hưởng đến tư duy lập trình của bạn và đấy không phải là điều đánh giá tốt về
bạn. Khi có một công việc yêu cầu một ngôn ngữ nào đó, ví dụ C++, thì bạn sẽ học
để hoàn thành công việc đó, chứ không phải học lập trình. Điều đó là quá hời hợt.
Cần học tư duy lập trình. Học một ngôn ngữ nào đó để được thực hiện các kiến
thức ấy và trải nghiệm với nó. Việc học lập trình phải là một quá trình dài, khổ
luyện, như những nhạc sỹ vĩ đại, dành cả cuộc đời cho âm nhạc. Hay như bất kỳ
một người nổi tiếng nào trên thế giới. Họ dùng cả tuổi trẻ để tập luyện, và cả cuộc
đời cho các thử nghiệm, làm đi, làm lại.
Các nghiên cứu cho thấy phải mất 10 năm để trở thành một chuyên gia trong một
lĩnh vực nào đó.Chìa khóa chính là làm và làm lại, thay đổi chính bạn trong các
công việc, phân tích sau mỗi thành công và thất bại. Việc lặp lại giúp bạn tập luyện
và hiểu hơn về lập trình, hiểu được nguyên nhân cụ thể để có thể sửa lỗi xảy ra dễ
dàng hơn.
Có thể tham khảo những kinh nghiệm sau cho một sự thành công:
- Thích thú. Thích thú lập trình, và giữ điều đó suốt ít nhất là 10 năm.
- Hỏi các lập trình viên khác, đọc các chương trình.
- Mức độ lớn nhất của hiệu suất cho một cá thể không thể tự động tăng như một
chức năng mở rộng kinh nghiệm, nhưng mức độ hiệu suất có thể có thể tăng,
ngay cả đối với cá nhân có kinh nghiệm cao nhất như là kết quả của nỗ lực cố
gắng để cải thiện. Và việc học hiệu quả cao nhất yêu cầu một công việc được
xác định với mức độ khó phù hợp với từng cá nhân, có sự phản hồi đánh giá,
lặp lại và có khả năng chỉnh sửa sai sót.
- Có thể học tại trường, tuy nhiên kinh nghiệm đưa lại là không nhiều
- Tham gia vào các dự án với các lập trình viên khác. Có thể trở thành người tốt
nhất hoặc tồi nhất. Nếu là người tốt nhất, có thể thử khả năng lãnh đạo. Khi bạn
là người tồi nhất, hãy học hỏi những người làm chung – những người thầy của
bạn.

- Làm việc trong những dự án maintain. Khi đó bạn cần hiểu chương trình đc viết
bởi những người khác. Bạn phải hiểu nó và fix các lỗi mà chương trình mắc
19


-

phải. Sau đó, khi tham gia các dự án khác, bạn sẽ phải nghĩ cần thiết kế thế nào
để đơn giản cho những người sẽ bảo trì sản phẩm của bạn sau này.
Tìm hiểu ít nhất 1 ngôn ngữ lập trình.
Cần tìm hiểu về khoa học máy tính. Cần biết bao lâu để máy tính có thể thực
hiện 1 câu lệnh, lấy 1 từ từ bộ nhớ ra?
Hãy tuân thủ đúng conding convention.
Hãy có ý thức tốt để đạt được nỗ lực tiêu chuẩn hóa nhanh nhất có thể.

20



×