Cách thiết kế 1 lớp gồm các hàm dùng chung

Mn có thể chia sẻ nếu mn cần một lớp gồm các hàm dùng chung (trên Webapp ) có thể gọi ở bất kỳ đâu, thì mn sẽ chọn thiết kế như nào ạ?

Cách em hay làm là tạo 1 lớp gồm các hàm tĩnh ( không biết vậy có tối ưu không ạ ). Cảm ơn mn đã góp ý.

Tuỳ vào nhu cầu sử dụng:

  • Extension method
  • Dependency Injection
  • Singleton
  • Static helpers
2 Likes

Như @LocNguyenXuan99 đề cập, tuỳ vào nhu cầu sử dụng.
Việc cậu làm là tạo class Utility (chứa các method mà không thuộc vào bất cứ object nào, và để nó static) để sử dụng. Đây là cách làm khá phổ biến, dễ cài đặt, nhưng cũng có nhiều drawback.

  • Nhìn chung, cậu sẽ khó test trên method static hơn là method thông thường. Vì rất khó để mock/stub method static (không có polymorphism thì điều này gần như không thể).
  • Cậu có thể gặp vấn đề về tổ chức source code.
    Utilitiy class (class chứa static method) đi ngược lại OOP (cậu không có object nào do tất cả method static có thể gọi được thông qua class. Không có encapsuation, inheritance, polymorphism gì có thể áp dụng được). Nếu cậu quá lạm dụng việc này, cậu sẽ có source code toàn static method.

Tất nhiên, nếu cậu có một vài method không có bất cứ side effect gì (như xử lý string, làm các phép toán, etc), dùng Utility class không có vấn đề gì. Nếu đó không phải use case của cậu, cậu nên đề cập rõ hơn use case của cậu, bọn tớ sẽ tư vấn phù hợp hơn.

3 Likes

Em chào 2 bác @LocNguyenXuan99, @library

Use case của e là xử lý file . E định tạo 1 lớp như trên e trình bày (gồm toàn static method) , lớp gồm 1 hàm public A, trong A gọi đến hàm B,C,D, trong đó hàm C là 1 delegate - là tham số của hàm A ( vì hàm B với D lúc nào cũng chỉ làm 1 việc cố định còn C sẽ tùy vào từng loại - các công việc không hề giống nhau ).

Em có tìm hiểu qua Singleton nhưng đến đoạn Thread safe gì đó e thấy không ổn lắm.

Mong 2 bác tư vấn e usecase này.

Sorry nha, dạo này tớ bận quá!

Vì cậu dùng delegate rồi (cậu đang thiết kế higher order function - đó là một cách tốt để cậu tự custom behavior từ nơi gọi tới method), và nếu cậu không có lý do gì để luôn đảm bảo chỉ có 1 instance của class đó, cậu chỉ cần 1 class bình thường (FileProccessor) là ổn.
Nếu cậu cần 1 instance thôi, và nếu cậu có thể dùng DI container (C# chắc có đó), cậu nên register object của class mà cậu có vào đó, và để DI container lo việc inject object của cậu vào nơi cậu cần dùng.

Biện pháp cuối cùng, nếu như cậu:

  • Không có DI container framework trong dự án của cậu, cậu có thể dùng singleton. Cơ mà, cậu phải tự lo các trade-off khi sử dụng singleton: tight-coupling code với object singleton đó, khó viết unit test, và nếu cậu để singleton object của cậu có state (có property mà có thể bị thay đổi), cậu sẽ phải lo tới thread-safe.
  • Nếu như cậu rất thích static như các cụ lập trình viên 30 năm trước, hoặc cậu có lý do đặc biệt để phải dùng static method, lúc đó cậu mới nên dùng. Static method cũng khiến cho code của cậu tight-coupling với class chứa static method đó, và cũng là kẻ thù của unit test.
5 Likes

Có phải nguyên nhân là do static method không phải là pure function và khi test static method kết quả bị ảnh hưởng bởi lần thực thi trước đúng không bác?

Google phát là có kết quả mà nhỉ :thinking:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?