• 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
Posts: 252
Joined: Wed 07/09/2005 4:02 pm
Location: Hải Phòng
Has thanked: 1 time
Been thanked: 12 times
Contact:

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

Postby HaiPT » Fri 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ổ
Posts: 58
Joined: Sat 17/05/2008 4:23 pm
Location: +∞
Has thanked: 1 time
Been thanked: 1 time

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

Postby devper94 » Fri 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
Last edited by devper94 on Sat 16/06/2012 11:57 am, edited 1 time in total.

HaiPT
VIP
VIP
Posts: 252
Joined: Wed 07/09/2005 4:02 pm
Location: Hải Phòng
Has thanked: 1 time
Been thanked: 12 times
Contact:

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

Postby HaiPT » Fri 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ổ
Posts: 58
Joined: Sat 17/05/2008 4:23 pm
Location: +∞
Has thanked: 1 time
Been thanked: 1 time

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

Postby devper94 » Sat 16/06/2012 11:53 am

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

dài quá?

HaiPT
VIP
VIP
Posts: 252
Joined: Wed 07/09/2005 4:02 pm
Location: Hải Phòng
Has thanked: 1 time
Been thanked: 12 times
Contact:

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

Postby HaiPT » Sun 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

User avatar
DucMjnh1992
Thành viên chính thức
Thành viên chính thức
Posts: 23
Joined: Sun 09/05/2010 7:32 pm
Location: Việt Nam.
Has thanked: 1 time
Been thanked: 1 time
Contact:

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

Postby DucMjnh1992 » Fri 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
Posts: 252
Joined: Wed 07/09/2005 4:02 pm
Location: Hải Phòng
Has thanked: 1 time
Been thanked: 12 times
Contact:

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

Postby HaiPT » Tue 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


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

Who is online

Users browsing this forum: No registered users and 2 guests