• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Nơi trao đổi, hỏi đáp về hướng đối tượng (OOP - Object-Oriented Programming), không giới hạn về ngôn ngữ lập trình
HaiPT
VIP
VIP
Bài viết: 252
Ngày tham gia: T.Tư 07/09/2005 4:02 pm
Đến từ: Hải Phòng
Has thanked: 1 time
Been thanked: 12 time
Liên hệ:

Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi HaiPT » T.Ba 17/01/2012 3:27 pm

Đây là một phương pháp thiết kế hệ điều hành có cung cấp các API ví dụ : Sound API để play 1 bài hát!
Phương thức play sound căn cứ vào sound driver hiên tại để đưa ra phương pháp play sound cho driver tương ứng !
Các bạn cho biết phương pháp sau có ưu , nhược điểm gì ?
Nếu có nhược điểm thì cách cải tiến như thế nào ?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace OOP.Demo
  6. {
  7.     class MicrosoftWindow
  8.     {
  9.         public enum SupportedSoundDrivers
  10.         {
  11.             StandardDriver,
  12.             YAMAHADriver,
  13.             SoundBlaster8Bit,
  14.             SoundBlaster16Bit,
  15.             CreatetiveDriver
  16.         }
  17.         private SupportedSoundDrivers _currentSoundDriver;
  18.         public  void PlaySound ( string mediaFile)
  19.         {
  20.             switch (_currentSoundDriver)
  21.             {
  22.                 case  SupportedSoundDrivers.CreatetiveDriver:
  23.                     PlaySoundWithCreatetiveDriver(mediaFile);
  24.                     break;
  25.                 case  SupportedSoundDrivers.SoundBlaster16Bit:
  26.                     PlaySoundWithSoundBlaster16Bit(mediaFile);
  27.                     break;
  28.                 case SupportedSoundDrivers.SoundBlaster8Bit:
  29.                     PlaySoundWithSoundBlaster8Bit(mediaFile);
  30.                     break;
  31.                 case  SupportedSoundDrivers.StandardDriver:
  32.                 PlaySoundWithStandardDriver(mediaFile);
  33.                     break;    
  34.                 case  SupportedSoundDrivers.YAMAHADriver:
  35.                     PlaySoundWithYAMAHADriver(mediaFile);
  36.                     break;
  37.                 default:
  38.                     Console.WriteLine(" No Sound Driver supported");
  39.                     break;
  40.             }
  41.         }
  42.         private void PlaySoundWithCreatetiveDriver( string mediaFile)
  43.         {
  44.             Console.WriteLine(" Play sound with CreatetiveDriver ");
  45.         }
  46.         private void PlaySoundWithSoundBlaster16Bit(string mediaFile)
  47.         {
  48.             Console.WriteLine(" Play sound with SoundBlaster16Bit ");
  49.         }
  50.         private void PlaySoundWithSoundBlaster8Bit(string mediaFile)
  51.         {
  52.             Console.WriteLine(" Play sound with SoundBlaster16Bit ");
  53.         }
  54.         private void PlaySoundWithStandardDriver(string mediaFile)
  55.         {
  56.             Console.WriteLine(" Play sound with StandardDriver ");
  57.         }
  58.         private void PlaySoundWithYAMAHADriver(string mediaFile)
  59.         {
  60.             Console.WriteLine(" Play sound with YAMAHADriver ");
  61.         }
  62.         public  MicrosoftWindow()
  63.         {
  64.             // When window start, system will detect  hardware
  65.             // for example
  66.             _currentSoundDriver = SupportedSoundDrivers.YAMAHADriver;
  67.         }
  68.  
  69.  
  70.     }
  71. }


Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi dazzlingvit » T.Ba 17/01/2012 8:07 pm

HaiPT đã viết:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace OOP.Demo
  6. {
  7.     class MicrosoftWindow
  8.     {
  9.         public enum SupportedSoundDrivers
  10.         {
  11.             StandardDriver,
  12.             YAMAHADriver,
  13.             SoundBlaster8Bit,
  14.             SoundBlaster16Bit,
  15.             CreatetiveDriver
  16.         }
  17.         private SupportedSoundDrivers _currentSoundDriver;
  18.         public  void PlaySound ( string mediaFile)
  19.         {
  20.             switch (_currentSoundDriver)
  21.             {
  22.                 case  SupportedSoundDrivers.CreatetiveDriver:
  23.                     PlaySoundWithCreatetiveDriver(mediaFile);
  24.                     break;
  25.                 case  SupportedSoundDrivers.SoundBlaster16Bit:
  26.                     PlaySoundWithSoundBlaster16Bit(mediaFile);
  27.                     break;
  28.                 case SupportedSoundDrivers.SoundBlaster8Bit:
  29.                     PlaySoundWithSoundBlaster8Bit(mediaFile);
  30.                     break;
  31.                 case  SupportedSoundDrivers.StandardDriver:
  32.                 PlaySoundWithStandardDriver(mediaFile);
  33.                     break;    
  34.                 case  SupportedSoundDrivers.YAMAHADriver:
  35.                     PlaySoundWithYAMAHADriver(mediaFile);
  36.                     break;
  37.                 default:
  38.                     Console.WriteLine(" No Sound Driver supported");
  39.                     break;
  40.             }
  41.         }
  42.         private void PlaySoundWithCreatetiveDriver( string mediaFile)
  43.         {
  44.             Console.WriteLine(" Play sound with CreatetiveDriver ");
  45.         }
  46.         private void PlaySoundWithSoundBlaster16Bit(string mediaFile)
  47.         {
  48.             Console.WriteLine(" Play sound with SoundBlaster16Bit ");
  49.         }
  50.         private void PlaySoundWithSoundBlaster8Bit(string mediaFile)
  51.         {
  52.             Console.WriteLine(" Play sound with SoundBlaster16Bit ");
  53.         }
  54.         private void PlaySoundWithStandardDriver(string mediaFile)
  55.         {
  56.             Console.WriteLine(" Play sound with StandardDriver ");
  57.         }
  58.         private void PlaySoundWithYAMAHADriver(string mediaFile)
  59.         {
  60.             Console.WriteLine(" Play sound with YAMAHADriver ");
  61.         }
  62.         public  MicrosoftWindow()
  63.         {
  64.             // When window start, system will detect  hardware
  65.             // for example
  66.             _currentSoundDriver = SupportedSoundDrivers.YAMAHADriver;
  67.         }
  68.  
  69.  
  70.     }
  71. }

Phương pháp cài đặt này có nhược điểm đầu tiên là mã lặp đi lặp lại, xa hơn là khó bảo trì, nâng cấp (ví dụ: thêm các loại Driver khác).
Giải quyết: tạo một lớp abstract (hoặc interaface) chung cho các Driver, sau đó viết các Driver dưới dạng các add-ons (giống như kiểu các Provider trong Data, Membership, Profile... ấy :D).
Lớp abstract (hoặc interface) chung có một số thuộc tính và phương thức cần thiết như: thuộc tính tên driver, phương thức phát nhạc một tập tin. Ngoài ra có thể mở rộng thêm các phương thức và thuộc tính khác nếu cần.
Các Driver được biên dịch dưới dạng các dll được đặt ở một thư mục nhất định, phục vụ cho việc tìm kiếm. Dùng kỹ thuật Reflect để gọi các dll này :D

HaiPT
VIP
VIP
Bài viết: 252
Ngày tham gia: T.Tư 07/09/2005 4:02 pm
Đến từ: Hải Phòng
Has thanked: 1 time
Been thanked: 12 time
Liên hệ:

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi HaiPT » T.Tư 18/01/2012 9:46 am

Khó bảo trì nâng cấp như thế nào :)
Vịt code thử xem!
Vịt có vẻ hiểu lý thuyết nhưng còn hơi mơ hồ thì phải :)
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi dazzlingvit » T.Tư 18/01/2012 11:05 pm

Do không đi học đàng hoàng nên lý thuyết không được chuẩn lắm ạ :D
Em code đại loại như sau:
Tạo lớp SoundDriver, xác định một số thuộc tính và phương thức cần thiết. Cùng với đó là hàm tìm kiếm và khởi tạo các driver có trong các tập tin dll trong thư mục Drivers :D
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Reflection;
  5.  
  6. namespace ConsoleApp
  7. {
  8.     /// <summary>
  9.     /// Sound Driver.
  10.     /// </summary>
  11.     public abstract class SoundDriver
  12.     {
  13.         #region Gets the sound driver
  14.  
  15.         private static Dictionary<string, SoundDriver> m_drivers = null;
  16.  
  17.         /// <summary>
  18.         /// Gets the <see cref="Dictionary&gt;string, ConsoleApp.SoundDriver&lt;"/> object that contains the list of sound drivers.
  19.         /// </summary>
  20.         public static Dictionary<string, SoundDriver> Drivers
  21.         {
  22.             get
  23.             {
  24.                 if (m_drivers == null)
  25.                 {
  26.                     m_drivers = new Dictionary<string, SoundDriver>();
  27.  
  28.                     //
  29.                     // Searches for the driver libraries.
  30.                     var files = Directory.GetFiles(string.Concat(Directory.GetCurrentDirectory(), "/Drivers"), "*.dll");
  31.  
  32.                     foreach (var fileName in files)
  33.                     {
  34.                         //
  35.                         // Opens assembly.
  36.                         var assembly = Assembly.LoadFile(fileName);
  37.  
  38.                         //
  39.                         // Gets all of sound drivers in the assembly.
  40.                         var types = assembly.GetTypes();
  41.                         foreach (var type in types)
  42.                             if (type.IsSubclassOf(typeof(SoundDriver)))
  43.                             {
  44.                                 //
  45.                                 // Initializes the driver.
  46.                                 var driver = (SoundDriver)type.GetConstructor(new Type[] { }).Invoke(new object[] { });
  47.                                 driver.Initialize();
  48.                                 m_drivers.Add(driver.Name, driver);
  49.                             }
  50.                     }
  51.                 }
  52.  
  53.                 return m_drivers;
  54.             }
  55.         }
  56.  
  57.         #endregion
  58.  
  59.         #region Properties
  60.  
  61.         /// <summary>
  62.         /// Gets the string value that is the identify of the sound driver.
  63.         /// </summary>
  64.         public abstract string Name { get; }
  65.  
  66.         /// <summary>
  67.         /// Gets the string value that is the title of the sound driver.
  68.         /// </summary>
  69.         public abstract string DisplayName { get; }
  70.  
  71.         #endregion
  72.  
  73.         #region Methods
  74.  
  75.         /// <summary>
  76.         /// Initializes the sound driver.
  77.         /// </summary>
  78.         protected abstract void Initialize();
  79.  
  80.         /// <summary>
  81.         /// Plays a media file with the file path.
  82.         /// </summary>
  83.         /// <param name="path">The file path.</param>
  84.         public abstract void PlaySound(string path);
  85.  
  86.         #endregion
  87.     }
  88. }
  89.  

Một số "driver" như sau:
  1. using System;
  2. using ConsoleApp;
  3.  
  4. namespace ProDriver
  5. {
  6.     public class CreativeDriver : SoundDriver
  7.     {
  8.         #region Properties
  9.  
  10.         /// <summary>
  11.         /// Gets the string value that is the identify of the sound driver.
  12.         /// </summary>
  13.         public override string Name { get { return "Creative"; } }
  14.  
  15.         /// <summary>
  16.         /// Gets the string value that is the title of the sound driver.
  17.         /// </summary>
  18.         public override string DisplayName { get { return "Creative Sound Driver"; } }
  19.  
  20.         #endregion
  21.  
  22.         #region Methods
  23.  
  24.         /// <summary>
  25.         /// Initializes the sound driver.
  26.         /// </summary>
  27.         protected override void Initialize() { }
  28.  
  29.         /// <summary>
  30.         /// Plays a media file with the file path.
  31.         /// </summary>
  32.         /// <param name="path">The file path.</param>
  33.         public override void PlaySound(string path)
  34.         {
  35.             Console.WriteLine("Playing {0}...", path);
  36.         }
  37.  
  38.         #endregion
  39.     }
  40. }
  41.  

  1. using System;
  2. using ConsoleApp;
  3.  
  4. namespace StandardDriver
  5. {
  6.     public class StandardDriver : SoundDriver
  7.     {
  8.         #region Properties
  9.  
  10.         /// <summary>
  11.         /// Gets the string value that is the identify of the sound driver.
  12.         /// </summary>
  13.         public override string Name { get { return "Standard"; } }
  14.  
  15.         /// <summary>
  16.         /// Gets the string value that is the title of the sound driver.
  17.         /// </summary>
  18.         public override string DisplayName { get { return "Standard Sound Driver"; } }
  19.  
  20.         #endregion
  21.  
  22.         #region Methods
  23.  
  24.         /// <summary>
  25.         /// Initializes the sound driver.
  26.         /// </summary>
  27.         protected override void Initialize() { }
  28.  
  29.         /// <summary>
  30.         /// Plays a media file with the file path.
  31.         /// </summary>
  32.         /// <param name="path">The file path.</param>
  33.         public override void PlaySound(string path)
  34.         {
  35.             Console.WriteLine("Playing {0} by {1}...", path, this.DisplayName);
  36.         }
  37.  
  38.         #endregion
  39.     }
  40. }
  41.  

Các driver có thể nằm trong nhiều dll hoặc nhiều cái cùng nằm trong một dll, không sao, vì hàm tìm kiếm đã tìm tất cả các tập tin và tất cả các kiểu được định nghĩa :D
Cuối cùng là chạy :D
  1. using System;
  2.  
  3. namespace ConsoleApp
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             SoundDriver.Drivers["Standard"].PlaySound("C:\aaa.flac");
  10.             SoundDriver.Drivers["Creative"].PlaySound("D:\bbb.flac");
  11.             Console.ReadLine();
  12.         }
  13.     }
  14. }
  15.  

Rất mong nhận được góp ý của anh HaiPT :)

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi Lam Tieu Tuong » CN 22/01/2012 7:16 am

Cái này ý bác HaiPt không làm đến mức như vit nói đâu, theo tớ chỉ là phân tích ưu nhược điểm giữa procedure oriented và object oriented thôi.
Phương án của bác HaiPt đưa ra là cách triển khai theo procedure oriented. Ưu điểm của phương án này là nếu khi ta thêm một khi ta thêm một function cho các loại driver có sẵn, ví dụ như Play3DSound chẳng hạn, thì không phải động chạm gì đến những tính năng cũ( ở đây là hàm PlaySound). Tuy nhiên, nhược điểm là nếu chúng ta có một loại driver mới thì phải thay đổi hàm đã có (ở đây là hàm PlaySound) để nó chạy cái tính năng ở loại driver mới này.
Ưu điểm của procedure oriented lại là nhược điểm của object oriented và ngược lại. Thế nên theo tớ bản chất của object oriented là tạo một nhóm những tính năng của cùng một tập hợp đối tượng rồi sau đó triển khai procedure oriented trong cái nhóm đó, bản thân nhóm đó cũng là một đối tượng.
Về cách triển khai theo hướng object oriented thì cũng khá giống với cách của vit.
Sửa lần cuối bởi Lam Tieu Tuong vào ngày CN 22/01/2012 7:41 am với 1 lần sửa.

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi Lam Tieu Tuong » CN 22/01/2012 7:31 am

Trước tiên là tạo một Interface SoundDriver và các class implementation tử cái Interface này:

Mã: Chọn hết

interface SoundDriver
    {
        public void PlaySound(string mediaFile);
    }
    class CreatetiveDriver : SoundDriver
    {
        #region SoundDriver Members

        public void PlaySound(string mediaFile)
        {
            Console.WriteLine(" Play sound with CreatetiveDriver ");
        }

        #endregion
    }
    class SoundBlaster16Bit : SoundDriver
    {
        #region SoundDriver Members

        public void PlaySound(string mediaFile)
        {
            Console.WriteLine(" Play sound with SoundBlaster16Bit ");
        }

        #endregion
    }
    class SoundBlaster8Bit : SoundDriver
    {
        #region SoundDriver Members

        public void PlaySound(string mediaFile)
        {
            Console.WriteLine(" Play sound with SoundBlaster8Bit ");
        }

        #endregion
    }

    class StandardDriver : SoundDriver
    {
        #region SoundDriver Members

        public void PlaySound(string mediaFile)
        {
            Console.WriteLine(" Play sound with SoundBlaster8Bit ");
        }

        #endregion
    }

    class YAMAHADriver : SoundDriver
    {
        #region SoundDriver Members

        public void PlaySound(string mediaFile)
        {
            Console.WriteLine(" Play sound with SoundBlaster8Bit ");
        }
        #endregion
    }

    class NoSoundException : SoundDriver, Exception
    {

        #region SoundDriver Members

        public void PlaySound(string mediaFile)
        {
            Console.WriteLine(" No Sound Driver supported");
        }

        #endregion
    }

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi Lam Tieu Tuong » CN 22/01/2012 7:35 am

Sau đó tớ tạo một factory class có một method để tạo ra các instance của SoundDriver dựa vào giá trị của currentSoundDriver, cái method này là static method:

  1. interface SoundDriver
  2.     {
  3.         public void PlaySound(string mediaFile);
  4.     }
  5.     class CreatetiveDriver : SoundDriver
  6.     {
  7.         #region SoundDriver Members
  8.  
  9.         public void PlaySound(string mediaFile)
  10.         {
  11.             Console.WriteLine(" Play sound with CreatetiveDriver ");
  12.         }
  13.  
  14.         #endregion
  15.     }
  16.     class SoundBlaster16Bit : SoundDriver
  17.     {
  18.         #region SoundDriver Members
  19.  
  20.         public void PlaySound(string mediaFile)
  21.         {
  22.             Console.WriteLine(" Play sound with SoundBlaster16Bit ");
  23.         }
  24.  
  25.         #endregion
  26.     }
  27.     class SoundBlaster8Bit : SoundDriver
  28.     {
  29.         #region SoundDriver Members
  30.  
  31.         public void PlaySound(string mediaFile)
  32.         {
  33.             Console.WriteLine(" Play sound with SoundBlaster8Bit ");
  34.         }
  35.  
  36.         #endregion
  37.     }
  38.  
  39.     class StandardDriver : SoundDriver
  40.     {
  41.         #region SoundDriver Members
  42.  
  43.         public void PlaySound(string mediaFile)
  44.         {
  45.             Console.WriteLine(" Play sound with SoundBlaster8Bit ");
  46.         }
  47.  
  48.         #endregion
  49.     }
  50.  
  51.     class YAMAHADriver : SoundDriver
  52.     {
  53.         #region SoundDriver Members
  54.  
  55.         public void PlaySound(string mediaFile)
  56.         {
  57.             Console.WriteLine(" Play sound with SoundBlaster8Bit ");
  58.         }
  59.         #endregion
  60.     }
  61.  
  62.     class NoSoundException : SoundDriver, Exception
  63.     {
  64.  
  65.         #region SoundDriver Members
  66.  
  67.         public void PlaySound(string mediaFile)
  68.         {
  69.             Console.WriteLine(" No Sound Driver supported");
  70.         }
  71.  
  72.         #endregion
  73.     }


Đây là lúc sử dụng:

  1.  SoundDriver soundDriver = SoundDriverFactory.buildSoundDriver(SupportedSoundDrivers.YAMAHADriver);
  2.             soundDriver.PlaySound("");

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi Lam Tieu Tuong » CN 22/01/2012 7:36 am

Mong bác HaiPt đợt này ăn tết nhiều thời gian trả lời sớm dùm nhé :). Cám ơn bác nhiều.

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi dazzlingvit » CN 22/01/2012 6:49 pm

Theo mình nghĩ quan niệm về hướng đối tượng của bạn không chính xác. Vì nếu hướng đối tượng đơn giản chỉ là gom tất cả các thành phần vào một rồi triển khai hướng cách thức vào đó thì khác gì người ta dùng hàm với các biến cấu trúc như ngày xưa đâu. Cái hay của hướng đối tượng nó nằm ở chính "3 đặc tính" của hướng đối tượng mà ai cũng biết.
.
Chúc mừng năm mới :D

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi Lam Tieu Tuong » CN 22/01/2012 10:44 pm

Những cái đặc tính đó của lập trình object oriented tớ không nói ra đây vì nó không liên quan gì đến việc so sánh hai phương án triển khai này cả. Mà thực ra ý trên tớ chỉ diễn giải tiếng việt của đại ca Robert Martin viết trong cuốn Clean Code: A Handbook of Agile Software Craftsmanship. Đây là một trong những cuốn sách must read của dân lập trình.

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi dazzlingvit » T.Hai 23/01/2012 11:00 am

Ý trên nào của bạn được diễn giải tiếng Việt của ... cơ?

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi Lam Tieu Tuong » T.Hai 23/01/2012 5:01 pm

Cái ưu nhược điểm ấy. Bạn đọc quyển Clean Code: A Handbook of Agile Software Craftsmanship. Ở phần Data/Object Anti-Symmetry có đưa ra hai phương pháp triển khai procedure oriented và object oriented rồi so sánh ưu nhược điểm của hai phương pháp này. Còn Robert Martin là tác giả của nhiều cuốn sách gọi là gối đầu giường của dân lập trình của mảng Enterprise Application ví dụ như Agile Software Development, Principles, Patterns, and Practices hay cuốn Clean Code.

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi dazzlingvit » T.Hai 23/01/2012 5:14 pm

Mình có cảm giác khái niệm lập trình hướng cách thức trong đầu mình và khái niệm hướng cách thức của bạn là không giống nhau. Không sao, vấn đề ở đây là bài toán của anh HaiPT. Triển khai theo mô hình nào thì cũng phải đảm bảo càng khoa học càng tốt.

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi Lam Tieu Tuong » T.Hai 23/01/2012 5:52 pm

Cái ví dụ của anh HaiPT cũng gần giống cái ví dụ trong phần đó mà. Nhưng nói chung về vấn đề OOP này phải là người có nhiều kinh nghiệm như bác HaiPT, làm qua nhiều project thì mới có cái nhìn đúng được. Mà nhiều khi đúng ở project cỡ này, qua project cỡ khác nó lại không hợp lý. Hi vọng bác ấy sớm vào trả lời cho anh em :).

Lam Tieu Tuong
Thành viên tích cực
Thành viên tích cực
Bài viết: 195
Ngày tham gia: CN 30/03/2008 8:46 pm
Been thanked: 18 time

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi Lam Tieu Tuong » T.Hai 23/01/2012 6:23 pm

Nói thêm thì ý tớ là procedure oriented và object oriented là hai cái bổ xung cho nhau. Nói đến object oriented thường người ta nghĩ đến design phase, tức là hình dung nó ở mức abstraction. Vì vậy người ta có thể dùng UML để thiết kế sự kết nối giữa các class với nhau mà hoàn toàn không động gì đến một ngôn ngữ lập trình nào rõ ràng cả. Như ví dụ ở trên kia, thằng MicrosoftWindow nó thực ra không cần phải biết đến cái hàm PlaySound nó implement thế nào, nó chỉ gọi cái hàm đó ra và cái SoundDriver hiện tại chạy nó thôi. Để giải quyết vấn đề này, OOP nó đẻ ra cái Interface và hỗ trợ polymorphism.

Nói về ưu điểm của OOP thì có mà nói cả ngày, tuy nhiên ưu điểm của procedure oriented thì ít người để ý. Cái phương án đầu tiên của anh HaiPT đưa ra không phải là nó không có ưu điểm của nó. Ví dụ như nếu bạn biết chắc là số lượng SoundDriver chỉ có gần đó thôi, hoàn toàn không thêm bớt gì nữa, chúng ta chỉ có thêm function cho các SoundDriver đó thì hoàn toàn có thể triển khai phương án đó vì khi thêm function chúng ta không phải động gì đến các function đã có cả.

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi dazzlingvit » T.Hai 23/01/2012 8:00 pm

Mình không rõ lắm về định nghĩ hướng đối tượng và hướng cách thức của bạn, nhưng với mình 2 cái này cho mình 2 cách tư duy để phân rã một bài toán lớn. Mà không nên lôi UML vào đây, thời hướng cách thức người ta vẫn phân tích thiết kế hệ thống thông tin ầm ầm, mà tất nhiên, vẫn tách biệt ra khỏi một ngôn ngữ lập trình cụ thể. Còn ví dụ về MS Windows mình cũng không hiểu lắm.
Nói về ưu điểm của OOP với mình chỉ cần bám vào 3 đặc tính của OOP là đủ, nói dài ra cũng chỉ là hệ quả của mấy cái kia mà thôi. Còn cách cài đặt đầu tiên, nếu bạn thêm 1 hàm nữa, bạn sẽ phải biên dịch lại chương trình.
.
.
Năm mới mà sao chẳng thấy anh HaiPT đâu nhỉ :D

HaiPT
VIP
VIP
Bài viết: 252
Ngày tham gia: T.Tư 07/09/2005 4:02 pm
Đến từ: Hải Phòng
Has thanked: 1 time
Been thanked: 12 time
Liên hệ:

Re: Thiết kế sau có nhược điểm gì !Phương pháp cải tiến ?

Gửi bàigửi bởi HaiPT » T.Ba 31/01/2012 1:36 am

Xin lỗi vì repply hơi muộn!

Kiến trúc hệ điều hành và method PlaySound của version đầu tiên có một số hạn chế :

-Khó mở rộng, mỗi khi thêm một SOUND DRIVER mới thì OS phải recomplie !
-METHOD playSound cực kỳ chậm chạm và quá tốn bộ nhớ, vì method này phải xử lý và include tất cả các loại sound driver!
( giả sử windows OS cần support trên 1000 loại driver thì .... ^:)^

Về cơ bản thì VỊT hiểu đúng về lý thuyết nhưng triển khai sai , vì về bản chất OS không cần load hết tất cả các loại driver!!
Kiến trúc tốt nhất apply trong trường hợp này như sau,
1 - Tạo 1 interface chung cho tất cả các loại cardSound Driver

  1.   public  interface   ISOUND
  2.     {
  3.         void PlaySound(string mediafire);
  4.     }
  5.  

2 - Bất cứ 1 SounDDriver nào muốn được windows support phải hỗ trợ ( IMPLEMENTED) INTERFACE trên
ví dụ :
  1. public  class  StandardSoundDriver:ISOUND
  2.     {
  3.         public void PlaySound(string mediafire)
  4.         {
  5.             Console.WriteLine("Play with standard device ");
  6.         }
  7.     }
  8.  


3- Như vậy : Class Windows OS được thiết kế lại đơn giản như sau
  1.     public  class NewOS
  2.     {
  3.         private ISOUND _currentSoundDevice;
  4.         public  NewOS()
  5.         {
  6.            _currentSoundDevice= new StandardSoundDriver();  
  7.         }
  8.        public  void InstallSoundDriver (  ISOUND soundDriver)
  9.        {
  10.            _currentSoundDevice = soundDriver;
  11.        }
  12.  
  13.         public  void PlaySound( string mediafire)
  14.         {
  15.             _currentSoundDevice.PlaySound(mediafire);
  16.         }
  17.     }
  18.  
  19.  

==> Như vậy các bạn thấy thủ tục PlaySound khá linh động và FAST, app được viết theo kiểu PLUG-IN cho phép bạn install thêm 1 driver bất kỳ !
Đây là ví dụ về cách dùng :
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             var WindowXP = new NewOS();
  6.             WindowXP.PlaySound("c:\abc.mp3"); // Play with standard device
  7.             WindowXP.InstallSoundDriver( new CreativeDriver());
  8.             WindowXP.PlaySound("c:\abc.mp3"); // Play with Creative device
  9.  
  10.         }
  11.        
  12.  
  13.     }
  14.  
  15.     class CreativeDriver:ISOUND
  16.     {
  17.         public void PlaySound(string mediafire)
  18.         {
  19.             Console.WriteLine(" Play with creative driver");
  20.         }
  21.     }


Ứng dụng nhỏ trên tôi đang dùng 1 biến thể của dependency injection pattern, base trên nguyên lý đa hình cuả OOP!
Những nguyên tắc cơ bản để chúng ta code và đánh giá chất lượng code thì dựa trên hai tiêu chí :
- COHENSIOn : Độ kết dính
- COUPLING : Độ ghép cặp
...
Các bạn cứ google để biết thêm chi tiết.
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT


Quay về “Lập trình hướng đối tượng (OOP)”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách