Trong bài thu hoạch này, em xin trình bày những nguyên lý sáng tạo của phương pháp TRIZ được ứng dụng trong ngôn ngữ lập trình JAVA, và cách ứng dụng phương pháp SCAMPER trong quản lý dự
Trang 1ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN - PHÒNG SAU ĐẠI HỌC
BÀI THU HOẠCH
PHƯƠNG PHÁP NGHIÊN CỨU KHOA HỌC TRONG TIN HỌC
ỨNG DỤNG PHƯƠNG PHÁP NGHIÊN CỨU KHOA HỌC TRIZ VÀ SCAMPER TRONG TIN
Trang 4LỜI NÓI ĐẦU
Trong mỗi con người luôn tồn tại những mặt đối lập: tốt – xấu; thiện – ác; sáng tạo – thụ động Nói về tư duy sáng tạo, chúng hiện hữu như một nhân tố bẩm sinh trong con người Nói cách khác ai cũng có khả năng sáng tạo, nhưng do tính trì trệ thụ động quá lớn đã đè ép cơ hội thắp sáng những tia sáng tạo; hoặc chúng ta không có phương pháp, không vận dụng đúng phương pháp sáng tạo để giải quyết vấn đề một cách khoa học sáng tạo Đặt biệt trong tin học, phương pháp sáng tạo giúp chúng ta định hướng tư duy, phát huy sáng tạo trong những trường hợp khó, và giải quyết vấn
đề một cách dễ dàng hơn, hệ thống hơn
Với môn học “phương pháp nghiên cứu khoa học trong tin học” giúp trang bị chúng
ta những phương pháp, nguyên lý giải quyết vấn đề khoa học hiệu quả nhất Trong bài thu hoạch này, em xin trình bày những nguyên lý sáng tạo của phương pháp TRIZ được ứng dụng trong ngôn ngữ lập trình JAVA, và cách ứng dụng phương pháp SCAMPER trong quản lý dự án phần mềm để tìm kiếm giải pháp cải thiện hiệu quả làm việc của nhóm Xin chân thành cảm ơn thầy Hoàng Kiếm đã trang bị những kiến thức, kinh nghiệm quý báu và truyền cảm hứng sáng tạo cho chúng em trong bước ngoặc nghiên cứu khoa học
Trang 5I Các nguyên lý sáng tạo khoa học được ứng dụng trong ngôn ngữ lập trình JAVA
1 Nguyên lý phân nhỏ và “tách riêng”
Nội dung:
• Chia một đối tượng thành nhiều phần độc lập
• Làm cho một đối tượng dễ dàng tháo rời
java.awt Các thành phần để xây dựng giao diện đồ hoạ (GUI)
java.util Cung cấp nhiều lớp và nhiều giao diện tiện ích khác
nhau, như là các cấu trúc dữ liệu, lịch, ngày tháng, v.v java.net Cung cấp các lớp và các giao diện cho việc lập trình
mạng TCP/IP
Trang 6JAVA chia nhỏ và tách riêng package thành nhiều thu viện nhỏ khác nhau giúp cho người lập trình linh động hơn, chỉ cần sử dụng (import) và cài đặt (implement) những thư viện cần thiết Tách những thư viện không cần thiết ra khỏi thư viện hiện hành để làm tăng khả năng thực thi, tiết kiệm không gian lưu trữ và vùng nhớ
Ví dụ: cấu trúc một dự án JAVA được chia nhiều packages như sau:
2 Nguyên lý phẩm chất cục bộ
Nội dung:
• Đổi cấu trúc của đối tượng từ đồng nhất sang không đồng nhất, đổi môi trường bên ngoài (hoặc tác động bên ngoài) từ đồng nhất sang không đồng nhất
• Đặt mỗi thành phần của đối tượng dưới điều kiện hoạt động tối ưu
Trang 7• Cho mỗi thành phần của đối tượng thực hiện một chức năng hữu ích khác nhau
Ứng dụng trong JAVA:
JAVA là ngôn ngữ lập trình hướng đối tượng, được chia nhỏ thành những lớp (class) khác nhau Với tính kế thừa và đa hình của JAVA, mỗi lớp có những phương thức riêng, cách ứng xử riêng và những phương thức chung, tính năng chung được kế thừa sử dụng lại từ lớp cha Ngoài ra, lớp còn có những phương thức cục bộ không chia sẽ dữ liệu với các lớp khác Đây là tính đóng gói của JAVA
Ví dụ:
public class Person {
private String firstName ;
private String lastName ;
private Date birthday ;
public Person(String firstName, String lastName, Date birthday) {
this firstName = firstName;
this lastName = lastName;
this birthday = birthday;
}
public String getFirstName() {
return firstName ; }
public String getLastName() {
return lastName ; }
public Date getBirthday() {
return birthday ; }
}
public class Student extends Person{
private String studentId ;
private String faculty ;
private List<Course> listOfCourse = new ArrayList<Course>();
public Student(String studentId, String firstName,
String lastName, Date birthday, String faculty) {
super (firstName, lastName, birthday);
this studentId = studentId;
Trang 8this faculty = faculty;
}
public String getStudentId() {
return studentId ; }
public String getFaculty() {
return faculty ; }
public void registerCourse(Course course){
// here local variable
boolean isAllowed = isAllowedToRegister();
if (isAllowed){
listOfCourse add(course);
} }
// here local method
private boolean isAllowedToRegister(){
return listOfCourse size()<20? true : false ; }
}
3 Nguyên lý phản đối xứng
Nội dung:
• Đổi hình dạng của đối tượng từ đối xứng sang bất đối xứng
• Nếu một đối tượng đã bất đối xứng, tăng mức độ bất đối xứng của nó
Trang 9Ví dụ:
public static void main(String[] args){
//init Person object as Student
Person p = new Student();
p.getFirstName();
//Cast Person to Student
Student s = (Student)p;
s.registerCourse( new Course());
Collection<Person> list = new ArrayList<Person>();
list.add( new Person());
list.add( new Student());
for (Person person : list){
System out println( "Firstname: " + person.getFirstName()); System out println( "Lastname: " + person.getLastName()); System out println( "Birthday: " + person.getBirthday());
if (person instanceof Student){
Student student = (Student) person;
System out println( "Faculty: " + student.getFaculty());
} }
• Cho các tác vụ nối tiếp hoặc song song với nhau; đặt chúng gần nhau
về mặt thời gian
Trang 10Ứng dụng trong JAVA:
Một lớp trong JAVA có thể được thiết kế cài đặt (implements) kết hợp nhiều giao diện (interface) khác nhau để tổng hợp nhiều phương thức, tính năng trong cùng một lớp
Ví dụ:
public interface InterfaceA {
public void doMethodA();
}
public interface InterfaceB {
public void doMethodB();
}
public class ClassImpl implements InterfaceA, InterfaceB{
public void doMethod() { }
@Override
public void doMethodB() {
// TODO Coding here
}
@Override
public void doMethodA() {
// TODO Coding here
} }
5 Nguyên lý vạn năng
Nội dung:
• Cho một thành phần hoặc một đối tượng thực hiện nhiều chức năng; loại bỏ các thành phần khác
Trang 11Ứng dụng trong JAVA:
Một chương trình viết bằng JAVA có thể chạy trên nhiều máy tính có hệ điều hành khác nhau Windows, Unix, Linux,…Viết một lần chạy mọi nơi “Write one run everywere”
Nền tảng JAVA SE 7 cho phép JAVA có thể làm việc với nhiều ngôn ngữ lập trình khác nhau JVM có thể chạy nhiều ngôn ngữ khác nhau và chúng tồn tại hài hoà với JAVA
6 Nguyên lý chứa trong
public class OuterClass {
public void outerMethod(){
}
public class InnerClass{
public void innerMethod(){
} }
}
Trang 127 Nguyên lý gây ứng suất sơ bộ
Nội dung:
• Nếu cần thiết phải thực hiện một hành động với tác động có hại lẫn có ích, hành động này nên được thay thế bằng hành động ngược lại để kiểm soát tác động có hại
• Tạo một áp lực ban đầu lên đối tượng để phản lại áp lực không mong muốn khi hoạt động
public void registerCourse(Course course) throws Exception{
// not allowed to register course that doesn't belong to faculty
if (!course.getCourseType().equals( faculty )){
throw new Exception( "Not allowed to register this course." );
}
// here local variable
boolean isAllowed = isAllowedToRegister();
if (isAllowed){
listOfCourse add(course);
} }
8 Nguyên lý thực hiện sơ bộ
Nội dung:
• Thực hiện trước thay đổi cần thiết trên đối tượng (toàn bộ hoặc một phần)
Trang 13• Sắp xếp trước các đối tượng để chúng có thể đi vào hoạt động từ vị trí thuận tiện nhất và không mất thời gian chờ
Ứng dụng trong JAVA:
Khi khởi tạo một đối tượng, dữ liệu của biến static được tạo trước, sau đó mới chạy hàm tạo (constructor) để cấp phát một chịa chỉ vùng nhớ mới cho đối tượng Như vậy đối tượng mới được chuẩn bị trước đầy đủ dữ liệu
Ví dụ:
public class Student extends Person{
private String studentId ;
private String faculty ;
// required courses for a Student, don't need to register
static List<Course> listOfCourse = new ArrayList<Course>();
static {
listOfCourse add( new Course( "IT" , "001" , "Triet Hoc" ));
listOfCourse add( new Course( "IT" , "002" , "PPNCKH" ));
}
public Student(String studentId, String firstName,
String lastName, Date birthday, String faculty) {
super (firstName, lastName, birthday);
this studentId = studentId;
this faculty = faculty;
}
public String getStudentId() {
return studentId ; }
public String getFaculty() {
return faculty ; }
Trang 14Ứng dụng trong JAVA:
Sử dụng Try-Catch trong lập trình để xử lý ngoại lệ (exception), và thực hiện phương án khác nếu có lỗi xảy ra
Ví dụ:
Student student = new Student( "001122" , "Huynh" , "Dang" , null , "MATH" );
Course course = null ;
// if Student is not allowed to register this course,
// then try to register another one of MATH.
course = new Course( "MATH" , "011" , "CSDL Co Ban" );
PooledConnection pooledConnection = dataSource.getPooledConnection();
return pooledConnection.getConnection(); // Obtain connection from pool
Trang 15}
private static InitialContext createContext() throws NamingException {
Properties env = new Properties();
env.put(Context INITIAL_CONTEXT_FACTORY ,
"com.sun.jndi.rmi.registry.RegistryContextFactory" );
env.put(Context PROVIDER_URL , "rmi://localhost:1099" );
InitialContext context = new InitialContext(env);
return context;
}
11 Nguyên lý đảo ngược
Nội dung:
• Đảo ngược hành động dùng để giải quyết vấn đề
• Cho các thành phần di chuyển được thành cố định, và các thành phần
// create array list object
ArrayList<String> arrlst = new ArrayList<String>();
// populate the list
Collections reverse (arrlst);
// [E, D, C, B, A]
System out println( "The Reverse List is :" +arrlst);
Trang 1612 Nguyên lý năng động
Nội dung:
• Cho phép (hoặc thiết kế) các đặc tính của đối tượng, môi trường bên ngoài hay quá trình có thể chuyển sang chế độ tối ưu hoặc tìm ra điều kiện hoạt động tối ưu
• Chia đối tượng thành các thành phần có thể chuyển động tương đối với nhau
• Nếu một đối tượng (hoặc quá trình) cố định hay thiếu linh động thì làm cho nó di chuyển hoặc tự thích nghi được
Ứng dụng trong JAVA:
Kiểu dữ liệu Map<key,value> lưu dữ liệu dưới dạng <key,value>, có thể lưu trữ bất kỳ kiểu đối tượng nào và có thể tách rời thành 2 danh sách chứa toàn key hoặc toàn value
Ví dụ:
Map map = new HashMap();
map.put( "key1" , new Person());
map.put( "key2" , new Student());
map.put( "key3" , new Integer(1000));
map.put( "key3" , "Sunday" );
// get keys only
• Thay vì hành động liên tục thì hành động theo chu kỳ hoậc theo nhịp
• Nếu một hành động đã có tính chu kỳ thì tăng mức độ hoặc tần số của
nó
Trang 17• Dùng khoảng nghỉ giữa các xung để thực hiện hành động khác
public static void main (String arguments ) {
TimerTask fetchMail = new FetchMail();
//perform the task once a day at 4 a.m., starting tomorrow morning
//(other styles are possible as well)
Timer timer = new Timer();
private final static long fONCE_PER_DAY = 1000*60*60*24;
private final static int fONE_DAY = 1;
private final static int fFOUR_AM = 4;
private final static int fZERO_MINUTES = 0;
private static Date getTomorrowMorning4am(){
Calendar tomorrow = new GregorianCalendar();
tomorrow.add(Calendar DATE , fONE_DAY );
Calendar result = new GregorianCalendar(
Trang 1814 Nguyên lý quan hệ phản hồi
Ví dụ:
public static void main( String args[] ){
try { // Load the database driver
Class forName ( "sun.jdbc.odbc.JdbcOdbcDriver" ) ; // Get a connection to the database
Connection conn = DriverManager getConnection ( "jdbc:odbc:Database" ) ; // Get a statement from the connection
Statement stmt = conn.createStatement() ; // Execute the Update
int rows = stmt.executeUpdate( "
UPDATE Cust SET CUST_NO = 9842 WHERE CUST_NO = 9841" ) ;
// Print how many rows were modified
// if rows=0, then go to insert new
System out println( rows + " Rows modified" ) ;
if (rows == 0){
stmt.executeUpdate( "
INSERT INTO Cust values('9842','9841','','' ) " );
} // Close the statement and the connection
Trang 19• Sử dụng vật thể truyền tải trung gian hoặc quá trình trung gian
• Tạm thời kết hợp đối tượng với một đối tượng khác mà có thể dễ dàng tháo bỏ
Ứng dụng trong JAVA:
Hai đối tượng (object) khác nhau được xem là cùng kiểu dữ liệu khi chúng cài đặt (implements) cùng một interface
Ví dụ:
public interface MidInterface {
public void doSonething();
}
public class ClassA implements MidInterface {
@Override
public void doSonething() {
// TODO Auto-generated method stub
}
}
public class ClassB implements MidInterface{
@Override
public void doSonething() {
// TODO Auto-generated method stub
}
}
Trang 20public static void main(String[] args) throws Exception{
List<MidInterface> list = new ArrayList<MidInterface>();
MidInterface classA = new ClassA();
17 Nguyên lý sao chép (copy)
Nội dung:
• Thay vì sử dụng đối tượng hiếm, đắt tiền, dễ vỡ thì dùng bản sao đơn giản và rẻ tiền hơn
• Thay thế đối tượng hoặc quá trình bằng bản sao quang học
• Nếu bản sao quang học đã được dùng thì chuyển sang bản sao hồng ngoại hoặc cực tím
Trang 21Ứng dụng trong JAVA:
Với tính kế thừa của lập trình hướng đối tượng JAVA, lớp con được thừa hưởng tất cả các phương thức của lớp cha, và có thể override bất kỳ phương thức nào khi cần
Ví dụ:
public class ParentClass {
public void doSomething(){
System out println( "ParentClass" );
}
}
public class ChildClass extends ParentClass{
@Override
public void doSomething(){
// copy here what ParentClass did first
super doSomething();
// adding code here to do specific some things for ChildClass
System out println( "Adding more code here." );
Trang 22Ví dụ:
public abstract class Person {
public abstract String getFirstName();
public abstract String getLastName();
public abstract List<Course> registerCourse(Course course); }
public class Student extends Person{
@Override
public String getFirstName() {
// TODO code here
return null ; }
@Override
public String getLastName() {
// TODO code here
return null ; }
@Override
public List<Course> registerCourse(Course course) {
// TODO code here
return null ; }
}
public class Teacher extends Person{
@Override
public String getFirstName() {
// TODO code here
return null ; }
@Override
public String getLastName() {
// TODO code here
return null ; }
@Override
public List<Course> registerCourse(Course course) {
// TODO code here
return null ; }
}