• 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

Thử tay nghề của bạn vói OOP !

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ệ:

Re: Thử tay nghề của bạn vói OOP !

Gửi bàigửi bởi HaiPT » T.Sáu 24/02/2012 11:26 pm

Code của FF đã đủ good rồi nhưng vẫn có thể optimize better!
Vẫn có thể rút gọn thêm 15 lines nữa :)
Hoặc rút gọn thêm 5 lines, vẫn đảm bảo đủ comment , const , tách thêm hai method InitializeBee, DamageBee
Code hiện tại hard code khá nhiều , hơi khó đọc!


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

devper94
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 58
Ngày tham gia: T.Bảy 17/05/2008 4:23 pm
Đến từ: +∞
Has thanked: 1 time
Been thanked: 1 time

Re: Thử tay nghề của bạn vói OOP !

Gửi bàigửi bởi devper94 » T.Sáu 15/06/2012 5:45 pm

Rút mãi vẫn còn 62 dòng không kể dòng trắng, hết khoảng hơn 30 min...

  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace Bee
  5. {
  6.  
  7.     class Program
  8.     {
  9.  
  10.         public static void Main(string[] args)
  11.         {
  12.             List<Bee> list = new List<Bee>(30);
  13.  
  14.             CreateNewBees(list);
  15.  
  16.             bool exit = false;
  17.  
  18.             while (!exit) {
  19.                 Console.Write("Lua chon: ");
  20.  
  21.                 string resp = Console.ReadLine();
  22.                 switch (resp) {
  23.                     case "1":
  24.                         CreateNewBees(list);
  25.                         for (int i = 0; i < list.Count; i++) {
  26.                             PrintBee(i + 1, list[i]);
  27.                         }
  28.                         break;
  29.                     case "2":
  30.                         var random = new Random();
  31.                         for (int i = 0; i < list.Count; i++) {
  32.                             var damage = random.Next(0, 80);
  33.                             list[i].Damage(damage);
  34.                             PrintBee(i + 1, list[i]);
  35.                         }
  36.                         break;
  37.                     case "q":
  38.                     case "Q":
  39.                     case "exit":
  40.                     case "quit":
  41.                         exit = true;
  42.                         break;
  43.                     default:
  44.                         break;
  45.                 }
  46.             }
  47.         }
  48.  
  49.         private static void PrintBee(int number, Bee bee)
  50.         {
  51.             Console.WriteLine("{0} bee {1}, alive = {2}, health = {3}", bee.Type, number, bee.Alive, bee.Health);
  52.         }
  53.  
  54.         private static void CreateNewBees(List<Bee> list)
  55.         {
  56.             list.Clear();
  57.             for (int i = 0; i < 10; i++) {
  58.                 list.Add(new Worker());
  59.                 list.Add(new Drone());
  60.                 list.Add(new Queen());
  61.             }
  62.         }
  63.     }
  64.  
  65.     public abstract class Bee
  66.     {
  67.  
  68.         public virtual string Type { get; protected set; }
  69.  
  70.         public virtual float Health { get; protected set; }
  71.  
  72.         protected int HealthLimit { get; set; }
  73.  
  74.         public virtual bool Alive
  75.         {
  76.             get
  77.             {
  78.                 return (this.Health > this.HealthLimit);
  79.             }
  80.         }
  81.  
  82.         public virtual void Damage(int damage)
  83.         {
  84.             if (this.Alive && damage > 0 && damage < 100) {
  85.                 this.Health -= damage;
  86.             }
  87.             if (this.Health < 0) {
  88.                 this.Health = 0;
  89.             }
  90.         }
  91.  
  92.         protected Bee(string type, int healthLimit)
  93.         {
  94.             this.Type = type;
  95.             this.Health = 100;
  96.             this.HealthLimit = healthLimit;
  97.         }
  98.     }
  99.  
  100.     public sealed class Worker : Bee
  101.     {
  102.         public Worker() : base("Worker", 70) { }
  103.     }
  104.  
  105.     public sealed class Drone : Bee
  106.     {
  107.         public Drone() : base("Drone", 50) { }
  108.     }
  109.  
  110.     public sealed class Queen : Bee
  111.     {
  112.         public Queen() : base("Queen", 20) { }
  113.     }
  114. }
  115.  


edit: chết, bây giờ mới nhận ra mình vừa đào mộ...
edit2: chỉnh 1 chút
Sửa lần cuối bởi devper94 vào ngày T.Bảy 16/06/2012 11:57 am với 1 lần sửa.

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: Thử tay nghề của bạn vói OOP !

Gửi bàigửi bởi HaiPT » T.Sáu 15/06/2012 10:48 pm

;) Nhìn đoạn code của devper94 viết thì từ nay bài này chỉ được viết trong vòng 45 lines thôi !
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

devper94
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 58
Ngày tham gia: T.Bảy 17/05/2008 4:23 pm
Đến từ: +∞
Has thanked: 1 time
Been thanked: 1 time

Re: Thử tay nghề của bạn vói OOP !

Gửi bàigửi bởi devper94 » T.Bảy 16/06/2012 11:53 am

:-/ tức là sao vậy anh

dài quá?

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: Thử tay nghề của bạn vói OOP !

Gửi bàigửi bởi HaiPT » CN 17/06/2012 11:17 am

Yes, vẫn dà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
DucMjnh1992
Thành viên chính thức
Thành viên chính thức
Bài viết: 23
Ngày tham gia: CN 09/05/2010 7:32 pm
Đến từ: Việt Nam.
Has thanked: 1 time
Been thanked: 1 time
Liên hệ:

Re: Thử tay nghề của bạn vói OOP !

Gửi bàigửi bởi DucMjnh1992 » T.Sáu 24/08/2012 7:52 pm

Lâu rồi ko vào forum hôm nay vào lại thấy có topic này hay quá nên cũng thử tham gia mong được anh HaiPT nhận xét code và rèn luyện. Em đào mộ mọng mọi người thông cảm. Dưới đây là code của em.

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4.  
  5. namespace Test
  6. {
  7.     public class Bee
  8.     {
  9.         public enum Type { Queen = 1, Drone = 2, Woker = 3 }
  10.  
  11.         private Random ran;
  12.         public Type BeeType { get; set; }
  13.         public int Health { get; set; }
  14.         public int HealthLimit { get; set; }
  15.         public bool IsAlive
  16.         {
  17.             get { return this.Health > this.HealthLimit; }
  18.         }
  19.  
  20.         public Bee()
  21.         {
  22.             Thread.Sleep(5);
  23.             this.ran = new Random();
  24.             this.BeeType = (Type)this.ran.Next(1, 4);
  25.             this.Health = 100;
  26.             this.HealthLimit = (this.HealthLimit = (int)this.BeeType * 25) % 2 == 0 ? this.HealthLimit : this.HealthLimit - 5;
  27.         }
  28.  
  29.         public void Dame()
  30.         {
  31.             this.Health = this.ran.Next(0, 80);
  32.         }
  33.  
  34.         public override string ToString()
  35.         {
  36.             return "Bee:" + this.BeeType.ToString() + "\tAlive: " + this.IsAlive + "\tHealth: " + this.Health + "\tHealthLimit: " + this.HealthLimit;
  37.         }
  38.     }
  39.  
  40.     public class Program
  41.     {
  42.         public enum BeeAction { Born = 1, Damage = 2, Display = 3 }
  43.  
  44.         public static void Action(List<Bee> lstBee, BeeAction action)
  45.         {
  46.             for (int i = 0; i < 20; i++)
  47.             {
  48.                 if (action == BeeAction.Born)
  49.                     lstBee.Add(new Bee());
  50.                 else if (action == BeeAction.Damage)
  51.                     lstBee[i].Dame();
  52.                 else if(action == BeeAction.Display)
  53.                     Console.WriteLine(lstBee[i].ToString());
  54.             }
  55.         }
  56.  
  57.         static void Main(string[] args)
  58.         {
  59.             List<Bee> lstBee = new List<Bee>();
  60.             int choose = 1;
  61.  
  62.             do
  63.             {
  64.                 Console.WriteLine("1. Born.");
  65.                 Console.WriteLine("2. Damage.");
  66.                 Console.WriteLine("3. Display.");
  67.                 Console.WriteLine("0. Quit.");
  68.                 choose = int.Parse(Console.ReadLine());
  69.                 Action(lstBee, (BeeAction)choose);
  70.             }
  71.             while (choose > 0);
  72.  
  73.             Console.Read();
  74.         }
  75.     }
  76. }

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: Thử tay nghề của bạn vói OOP !

Gửi bàigửi bởi HaiPT » T.Ba 18/09/2012 8:42 pm

Code khó maintain, extent : Mỗi khi muốn thêm 1 loại ong thì chỉ có nước build lại, ( hãy thử tưởng tượng hệ điều hành windows sẽ phải nâng cấp nên SP mới nếu có 1 loại sound card mới cần support ?)
Code tốn bộ nhớ nếu có hàng ngàn loại ong
Code chạy chậm nếu có hàng ngàn loại ong cần support
Code đọc khá khó hiểu :)
Mã ngắn nhất chỉ cần 45 lines ( NET 4)
Mã tiêu chuẩn chỉ cần 60 lines ( NET 2)
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