Datgs' Blog

Quyết chiến quyết thắng !

Archive for the category “Java”

Tiers và Layers

Dân IT thì chẳng ai là không biết Tier và Layer và cũng thường sử dụng phiên phiến. Nhưng ở đây có những sự khác biệt:

Layers: cách bạn tổ chức mã nguồn thành các tầng logic, và đơn thuần chỉ là như vậy. Đơn giản nhất là trong lập trình .NET thường nói đến 3tiers: Presentation , Business và Data (nhưng về mặt logic chỉ có thể coi là 3 layers)

Tier: Là nói đến mức vật lý, cụ thể hơn, tier trực tiếp nói về nơi mà mã nguồn được thực thi. Tức là nơi mà layer được triển khai.

Ví dụ nói đến DATA TIER là nói đến database, filesystem … nhưng ngay tại DATA TIER đã cài đặt trong đó những logic layer… (sẽ update sau)

Design Pattern – Creational Pattern – Factory Method

1) Một phương án giải quyết vấn đề tạo object.

2) Câu hỏi là: Làm sao để tạo object mà không cần phải chỉ rõ class cụ thể của object đó là gì?

3) Lợi ích: cho phép chỉ rõ “nội dung” của đối tượng cần tạo. Thường sử dụng các hàm static.

4) Ví dụ về hàm tạo theo cách đặt tên mô tả:

class Complex
{
     public static Complex fromCartesian(double real, double imag) {
         return new Complex(real, imag);
     }

     public static Complex fromPolar(double modulus, double angle) {
         return new Complex(modulus * cos(angle), modulus * sin(angle));
     }

     private Complex(double a, double b) {
         //...
     }
}

Complex c = Complex.fromPolar(1, pi); // Same as fromCartesian(-1, 0)

5) Ví dụ về hàm tạo theo các đóng gói:

public interface ImageReader {
    public DecodedImage getDecodedImage();
}

public class GifReader implements ImageReader {
    public DecodedImage getDecodedImage() {
        return decodedImage;
    }
}

public class JpegReader implements ImageReader {
    // ....
}
public class ImageReaderFactory {
    public static ImageReader getImageReader(InputStream is) {
        int imageType = determineImageType(is);

        switch(imageType) {
            case ImageReaderFactory.GIF:
                return new GifReader(is);
            case ImageReaderFactory.JPEG:
                return new JpegReader(is);
            // etc.
        }
    }
}

6) Hạn chế:

- Nếu hàm tạo (construct method) của class là private, sẽ không tạo được object bằng hàm tạo, mà buộc phải sử dụng hàm factory.
- Không thể mở rộng (kế thừa thêm nữa) ở các subclass nếu hàm tạo là private.
- Không còn đúng cho các subclass. Nếu có subclass gọi hàm factory, nó trả về instance của class chứ khôngphải là nó.

- Giải quyết: cần phải có sự hỗ trợ thêm nữa của các ngôn ngữ lập trình.

Syntax của ngôn ngữ lập trình

Về mặt hình thức thì đúng là các ngôn ngữ giống nhau về syntax. Có thể gọi đó là trào lưu cũng được. Trước đây khi ngôn ngữ C ra đời, nó được trào đón và thực sự vượt hẳn lên trên Pascal trong việc phát triển các hệ thống. Và đẩy Pascal trở về đúng vị trí của nó: một cuốn sách giáo khoa về lập trình. Và các ngôn ngữ sau này, thông thường là Like C.

Những phá cách theo kiểu Python không phải là không được chào đón. Tuy nhiên Like C vẫn được ưa thích hơn cả. Theo chủ quan của anh, và có lẽ cũng là của các lập trình viên khác là có lẽ là vì nó “vừa đủ”. Vừa đủ ngắn và vừa đủ dài (hình thức bao gồm keyword, operator …). C cũng vừa đủ giản đơn cho người mới học lập trình, và cũng đủ phức tạp để thể hiện được ý tưởng của các giải thuật cơ bản. Nó khó học hơn pascal một chút (một chút thôi), nhưng viết mã đơn giản hơn Pascal gấp nhiều lần. Vì vậy lựa chọn C là hợp lý.

Các ngôn ngữ sau này hầu hết được sinh ra từ ngôn ngữ C (tức là xây dựng nên từ các dòng code C).

Về mặt nội dung, mỗi ngôn ngữ lập trình là một công cụ với mục đích cụ thể. Không có ngôn ngữ nào ra đời chỉ để “cho vui”. Sự khác nhau và giống nhau của các ngôn ngữ là ở chỗ “nó được sử dụng để làm gì?”.

Và cũng vì đó là một công cụ, một công cụ dành cho con người sử dụng. Cho nên, không nên nghĩ rằng cái này khó lắm, cái kia khó lắm không học được đâu !!! Mà nên nghĩ rằng cái này chưa biết, cái kia biết rồi. Cũng từa tựa như là việc sử dụng MS Word vậy thôi.

So sánh như vậy là hơi khập khiễng, bởi vì MS Word là công cụ ứng dụng dành cho nhân viên văn phòng (rộng hơn là everybody), còn ngôn ngữ lập trình là công cụ đa năng (và chỉ một số đối tượng được chuyên môn hóa mới có thể tiếp cận được).

Quan trọng nhất của việc sử dụng ngôn ngữ lập trình là tư duy logic, tư duy ở cấp độ con số.

Java Generics

Example generic class:

public class Pair<T, S>
{
/* construct*/
  public Pair(T f, S s)
  {
    first = f;
    second = s;
  }
 
/*set / get*/
  public T getFirst()
  {
    return first;
  }

  public S getSecond()
  {
    return second;
  }

  public String toString()
  {
    return "(" + first.toString() + ", " + second.toString() + ")";
  }

  private T first;
  private S second;
 /*định nghĩa phương thưcs twice*/
  public <T> Pair<T,T> twice(T value)
  {
     return new Pair<T,T>(value,value);
  }

}

Use:

Pair<String, String> grade440 = new Pair<String, String>("mike", "A");
Pair<String, Integer> marks440 = new Pair<String, Integer>("mike", 100);
System.out.println("grade:" + grade440.toString());
System.out.println("marks:" + marks440.toString());
Uses twice:
Pair<String, String> pair = twice("Hello");

Observed Pattern Design

public class Parent
{    
     public String Name { getset; }
     public void OnChildCry(Child c){
        Console.WriteLine(this.Name + ” heard “ + c.Name + ” cry”);
    }
}

public class Child
{
    public Child()
    {
        Parents = new List<Parent>();
    }
    public String Name { getset; }
    public List<Parent> Parents { getset; }

     public void Cry()
   {
        foreach(Parent p in Parents)
            p.OnChildCry(this);
    }
}

 class Program
{
    static void Main(string[] args)
    {
        Parent Ralph = new Parent { Name = “Ralph” };
        Child Billy = new Child { Name = “Billy” };
        Parent Mary = new Parent { Name = “Mary” };
         Billy.Parents.Add(Ralph);
        Billy.Parents.Add(Mary);
         Billy.Cry();
         Console.Read();
    }
}

Post Navigation

Follow

Get every new post delivered to your Inbox.