Lưu trữ

Archive for the ‘Phương pháp lập trình’ Category

Polymorphism in C++

Đa hình (polymorphism) là tính năng rất có ích, được ứng dụng rất phổ biến trong lập trình hướng đối tượng. Trong khuôn khổ của bài viết này, tôi sẽ giới thiệu sơ lược về kỹ thuật đa hình và cách cài đặt trong C++. Nếu chúng ta đã làm quen với ngôn ngữ lập trình hướng đối tượng thì việc hiện thức nó trong những ngôn ngữ khác C++ là chuyện không quá khó khăn. Để hiểu cơ chế làm việc của polymorphism, chúng ta theo dõi ví dụ sau:

Advertisements

Giới thiệu lập trình thủ tục

Giới thiệu lập trình thủ tục

Nhiều ngôn ngữ lập trình truyền thống mà sinh viên vẫn thường học đầu tiên khi mới tập tễnh bước vào nghề IT là những ngôn ngữ lập trình kiểu thủ tục (procedural languages). Có thể kể ra một số ngôn ngữ lập trình dạng này như: C, C++, Fortran, Pascal, và Basic.

Một chương trình được viết theo kiểu lập trình thủ tục là một dãy các lệnh (instructions), nói với máy tính biết tuần tự các bước để làm một việc nào đó: Open a file, read a number, multiply by 4, display something. Các đơn vị của chương trình bao gồm các khối chương trình chính, các khối chương trình con, các hàm và thủ tục; các tầm vực, các thư viện dùng thêm hoặc những modules bên ngoài dùng kèm với chương trình.

Lập trình thủ tục phù hợp với những dự án nhỏ. It is the most natural way to tell a computer what to do, and the computer processor’s own language, machine code, is procedural, so the translation of the procedural high-level language into machine code is straightforward and efficient. What is more, procedural programming has a built-in way of splitting big lists of instructions into smaller lists: the function.

Giới thiệu lập trình hàm

Lập trình hàm là một kiểu lập trình mà tính toán các mô hình như là ước tính các biểu thức. Để hiểu rõ về lập trình hàm, bạn nên bắt tay vào việc học một ngôn ngữ nào đó có hỗ trợ kiểu lập trình hàm như Common Lisp, Ocaml hay Haskell.
Trong lập trình hàm, các chương trình được thực thi bằng việc ước tính các biểu thức, điều này ngược với kiểu lập trình mệnh lệnh (imperative programming) mà ở đó chương trình bao gồm nhiều câu lệnh thay đổi trạng thái toàn cục khi chạy chương trình. Với kiểu lập trình hàm chúng ta tránh được điều này nhờ sử dụng cơ chế biến đổi trạng thái (mutable state).

Lập trình hàm đòi hỏi tên hàm đi trước tiên, nghĩa là chúng được xử lý giống như các giá trị khác và có thể được truyền như là tham số cho các hàm khác hoặc trả về như một kết quả của một hàm. Hàm là đơn vị chính để xây dựng các chương trình.

Tham khảo

[1] http://www.staff.science.uu.nl/~fokke101/courses/fp-eng.pdf

[2] http://www-typo3.cs.ucl.ac.uk/students/syllabus/msccs/gc16_functional_programming/

What is the difference between Association, Aggregation and Composition?

Xem hình này sẽ hiểu rõ hơn về sự khác nhau giữa 3 cụm từ này trong lập trình hướng đối tượng.

https://i1.wp.com/www.codeproject.com/KB/architecture/OOP_Concepts_and_manymore/association_aggre_com.gifNói chung, chúng ta có thể kết luận rằng aggregation là một trường hợp đặc biệt của một associationcomposition là một trường hợp đặc biệt của aggregation.

Phương thức static (class) và instance

Tiếp theo bài giới thiệu về Overloading và Overriding, tôi muốn tóm lại sự khác biệt cũng như điểm lưu ý của các phương thức lớp (phương thức tĩnh) và phương thức instance. Đây là hai kiểu phương thức sử dụng phổ biến trong lập trình hướng đối tượng

Phương thức lớp (tĩnh) (Static Methods): là phương thức được gọi thông qua tên lớp. Trong quá trình cài đặt phương thức chúng ta dùng từ khóa static.

Xem ví dụ:

class MyUtils {
    . . .
    //================================================= mean
    public static double mean(int[] p) {
        int sum = 0;  // sum of all the elements
        for (int i=0; i<p.length; i++) {
            sum += p[i];
        }
        return ((double)sum) / p.length;
    }//endmethod mean
    . . .
}

Muốn gọi phương thức này bên trong lớp mô tả nó, chúng ta chỉ cần sử dụng tên phương thức: mean(). Tuy nhiên, nếu gọi phương thức bên ngoài lớp chúng ta phải kèm theo tên lớp; nghĩa là: MyUtils.mean().

Phương thức instance: kết hợp với một object và các biến instance của object đó.

Ví dụ:

// File   : dialog/capitalize/Capitalize2.java
// Purpose: Capitalize first letter of each name.  Declare with first use.
// Author : Fred Swartz - placed in public domain.
// Date   : 30 Mar 2006

import javax.swing.*;

public class Capitalize2 {

    public static void main(String[] args) {
        //.. Input a word
        String inputWord = JOptionPane.showInputDialog(null, "Enter a word");

        //.. Process - Separate word into parts, change case, put together.
        String firstLetter = inputWord.substring(0,1);  // Get first letter
        String remainder   = inputWord.substring(1);    // Get remainder of word.
        String capitalized = firstLetter.toUpperCase() + remainder.toLowerCase();

        //.. Output the result.
        JOptionPane.showMessageDialog(null, capitalized);
    }
}

Các phương thức: substring, toUpperCase, toLowerCase là các phương thức instance. Các phương thức showInputDialog, showMessageDialog là các phương thức lớp.

Overloading và Overriding trong OOP

Nhiều lần nhầm lẫn cái này nên tôi bèn lập ra một trang để ghi lại sự khác biệt cơ bản của hai anh này.

Overloading:

Dịch ra tiếng Việt nghĩa theo nghĩa chuyên ngành là  quá tải lên cái đã có (nghe buồn cười quá). Thật vậy, trong OOP (Object-Oriented Programming) chúng ta có thể khai báo các phương thức (hàm) có cùng tên nhưng khác nhau về kiểu của các đối số (arguments), kiểu trả về của phương thức và cả số lượng đối số của phương thức.

Một ví dụ minh họa như sau:

Giả sử chúng ta có một lớp định nghĩa phương thức Cộng:

public class Demo {
  public int Cong(int x, int y) {
    return x + y;
  }

  public string Cong(string s1, string s2) {
    return s1.Concat(s2);
  }
}

Hai phương thức Cong định nghĩa trong cùng lớp là đặc điểm khác biệt thứ hai giữa Overloading và Overriding.

Overriding:

Nếu tách hai từ này ra thì hiểu nghĩa rõ ràng hơn. Dịch sát theo tiếng Việt là che phủ lên cái đã có (nghe lạ lạ nữa). Trong OOP, các phương thức được gọi là overriding nếu chúng có cùng đối số (cả về kiểu lẫn số lượng) nhưng được định nghĩa ở các lớp khác nhau. Cụ thể: một phương thức định nghĩa ở lớp cơ sở (base class) và phương thức kia định nghĩa ở lớp dẫn xuất (derived class).

Chúng ta xem xét ví dụ sau:

class Animal{
   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{
   public void move(){
      super.move(); // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog{
   public static void main(String args[]){
      Animal b = new Dog(); // Animal reference but Dog object
      b.move();//Runs the method in Dog class
   }
}

Một số quy tắc sử dụng phương thức overriding:

  • Danh sách đối số nên giống hoàn toàn với phương thức được overriden.
  • Kiểu trả về nên giống (hoặc là kiểu con) với kiểu trả về của phương thức được overriden được mô tả trong lớp cơ sở.
  • Mức độ truy cập bị hạn chế hơn nhiều so với phương thức được overriden ở lớp cơ sở.
  • Các phương thức instance chỉ có thể overriden nếu chúng kế thừa từ lớp cơ sở.
  • Các phương thức được mô tả final (trong java) không được overriden.
  • Các phương thức được mô tả static thì không overriden nhưng được mô tả lại.
  • Các phương thức không kế thừa sẽ không được overriden (hiển nhiên)
  • Trong một lớp dẫn xuất nằm cùng gói với lớp cơ sở của các thể hiện (instance), chúng ta có thể override tất cả các phương thức của lớp cha mà không được khai báo final hoặc private.
  • Đối với các lớp dẫn xuất nằm khác gói với lớp cơ sở, chỉ có thể override các phương thức không phải final được khai báo là public hoặc protected.
  • Các hàm tạo không thể overriden.

Một số bài báo thảo luận rằng chúng ta có thể hiểu overloading là static (easy binding) polymorphism và overriding là dynamic (late binding) polymorphism.

Tóm lại:

Overloading: Methods name same but signatures is different in the class.

Overriding:To redefine the base class method in the derived class is called overriding.

static binding: compile time binding

dynamic binding: run time binding

signatures: arguments

TechCrunch

Startup and Technology News

KTLA

Los Angeles News and Video for Southern California

GROUPE IFV - Ingénieurs France-Vietnam

La page d'information du groupe des ingénieurs france-vietnam

Journal Métro

Le site web du quotidien gratuit Métro Montréal

CHUNG ACADEMY

www.hoaichung.com

5 Continents 4 Oceans

Chuyên trang DU LỊCH và DU HỌC

VinaCode

Lập trình & Cuộc sống

Khải Đơn

Vui chơi hết ngày tháng

Love & Luce

A Canadian executive businesswoman moves to Rome, for amore & luce!

Hội Anh Em Dân Chủ

Vì một nước Việt: Dân chủ - Văn minh - Pháp trị

The Art of Scientific Communication

Advice for university students in science and engineering - by Faye Hicks, PhD, PEng

MoopenCafé - Mobile Open Café

“A mind is like a parachute. It doesn't work if it is not open.” ― Frank Zappa

Economics One

A blog by John B. Taylor

BarDev - Archive

A programming blog by Mike Barlow

NHỮNG HỒI ỨC VÀ KỶ NIỆM LỊCH SỬ

Trăm năm bia đá thì mòn, Ngàn năm bia miệng vẫn còn trơ trơ

Wine Blog

by Coco Linh

Xi'an's Og

an attempt at bloggin, nothing more...

Just Go

...as long as we're together

My Journey With Data Science

'every journey begins with a single step'