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

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

Gửi bàigửi bởi HaiPT » T.Hai 06/02/2012 6:46 pm

Bạn có thể làm tập này trong thời gian cho phép là 40p không ?
Và code càng ngắn càng tốt ( 60 lines - thiết kế theo OOP)
:)
Nếu làm được thì ..chúc mừng ! Năng lực của bạn đã ngang ngửa với 1 lập trình viên có 1 năm kinh nghiệm

Mã: Chọn hết

Write classes to represent 3 different types of Bee - Worker, Queen and Drone.
Each Bee has a floating-point health property, which is not writable externally and upon creation is set to a value of 100 (percent).
Each Bee has a Damage() method that takes a single integer parameter that should be a value between 0 and 100. When this method is called, the health of the bee is to be reduced by that percentage of their current health.
When a Worker has a health below 70% it cannot fly and therefore is pronounced Dead. When a Queen has a health below 20%, or a Drone below 50%, it is pronounced dead. This 'Dead' property should be readable from each Bee. When a Bee is dead, no further health deductions should be recorded by the bee, although the Damage() method should still be invokable without error.
Your application should create a single list containing 10 instances of each type of Bee and store in a list or array. It must support methods to allow Damage() to be called for each Bee, and to return the health status of each bee, including whether it is alive or not.
 Your application interface must contains 2 functions ( user press “1” or “2” to activate this function :
 1 – Create bee list – Clear current bee list and create new random bees, then display in the console windows
 2 – Attack bees   - Attack current bee list , a different random value between 0 and 80 should be selected for each bee and applied with a call to Damage(). After attacked, the user interface should refresh to show the health status of the bees  in console windows
Other requirements:
Application type: Console
Sửa lần cuối bởi HaiPT vào ngày T.Ba 20/03/2012 6:39 pm với 1 lần sửa.


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
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

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

Gửi bàigửi bởi vo_minhdat2007 » T.Hai 06/02/2012 9:36 pm

Hì, đọc bài của anh là lo cài VS (vì vừa cài lại Win) ngay :D Em mới (tự) nghiên cứu OOP được gần 6 tháng thôi, nhưng cũng xin tham gia cùng. Bài làm trong vòng 34 phút, do sợ "vượt rào" nên không dám bỏ thời gian test thêm, nên có thể chưa hoàn hảo. Mong nhận góp ý từ anh Hải :)

Bee.png
Bee.png (32.08 KiB) Đã xem 5277 lần
Tập tin đính kèm
BeeOOP.zip
(49.44 KiB) Đã tải 847 lần

Hình đại diện của người dùng
TheDark
Guru
Guru
Bài viết: 188
Ngày tham gia: T.Năm 04/11/2010 3:56 pm
Đến từ: Mang Thít - Vĩnh Long
Has thanked: 6 time
Been thanked: 33 time

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

Gửi bàigửi bởi TheDark » T.Ba 07/02/2012 5:24 am

Bài làm của bạn Đạt rất hay. Nhưng mình nghĩ nó chưa OOP hoàn toàn. :P
Mình nghĩ, cần có một clsBeesManager. clsBeesManager sẽ chưa danh sách bees. Các phương thức khởi tạo danh sách, damage cũng ở trong class này.! :)
Trong form ta sẽ chỉ xử lý giao diện và khởi tạo class BeesManager thôi!

HaiPT
VIP
VIP
Bài viết: 251
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 07/02/2012 11:05 am

Đạt làm đúng rồi đấy, tuy nhiên code chưa đẹp và còn thừa khá nhiều lệnh !
Em thử upgrade lên version 2, kết hợp thêm comment của TheDark xem!
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
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

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

Gửi bàigửi bởi vo_minhdat2007 » T.Ba 07/02/2012 6:32 pm

Cảm ơn anh HảiPT và TheDard đã góp ý :)

Em chưa hiểu ý anh Hải, là code chưa đẹp và thừa ở chỗ nào? Nếu là về dùng chỉ từ this thì em xin phép giữ nguyên, vì cho rằng nó có 2 ưu điểm (nguồn thảo luận):
- Bảo đảm an toàn cho code (tránh ambiguity).
- Code đọc dễ dàng hơn.

Mong tiếp tục nhận được góp ý của anh :)
Tập tin đính kèm
BeeOOP.zip
(53.24 KiB) Đã tải 463 lần

HaiPT
VIP
VIP
Bài viết: 251
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 12/02/2012 9:49 pm

:) Yêu cầu của đề là chỉ được viết trên dưới 60 lines thôi :)
Túm lại là 3 cái class bee và BeeManager phải viết trong 60 lines :)
Nếu đo đếm cẩn thận thì thấy code chưa tối ưu!. và ..thừa khá nhiều;))
Em nâng cấp lên version nữa xem sao !!
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
TheDark
Guru
Guru
Bài viết: 188
Ngày tham gia: T.Năm 04/11/2010 3:56 pm
Đến từ: Mang Thít - Vĩnh Long
Has thanked: 6 time
Been thanked: 33 time

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

Gửi bàigửi bởi TheDark » T.Ba 14/02/2012 5:36 pm

Version 2 của bạn Đạt hình như "kém" hơn version 1 :P
Đây là cách làm của mình. (có sử dụng một số code của bạn Đạt :D )
Tập tin đính kèm
BeeOOP.rar
(44.59 KiB) Đã tải 462 lần

HaiPT
VIP
VIP
Bài viết: 251
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 14/02/2012 6:20 pm

Cách viết của TheDard có nhiều lỗi :
- Vi phạm nguyên tắc thiết kế OOP! Vả lại cũng sai so với requirement từ dòng đầu tiên!
"Write classes to represent 3 different types of Bee - Worker, Queen and Drone"
- Performance của property Death sẽ rất tệ nếu số lượng ong có trên 1000 loại :) ,giả sử loại ong cần tìm ở vị trí cuối trong swich case.. thì kết quả máy tính phải so sánh đến 1000 lần..
- Tốn bộ nhớ
- Số lượng dòng code thừa vẫn chiếm tỷ lệ khá lớn : ví dụ sau return không cần "break"
- Lỗi Hard code rất nhiều !
- Convention coding không thống nhất ví dụ method name lúc thì Pascal case lúc thì camel case !
- Một số biến khai báo không sử dụng : _mdeath

Yêu cầu của bài chỉ cần console, viết đúng yêu cầu, design theo OOP, reused code tới MAXIMUM và chỉ cần trên dưới .....60 lines! không hơn :P
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

HaiPT
VIP
VIP
Bài viết: 251
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 14/02/2012 6:31 pm

Cách code của Đạt thì design đúng nhưng chưa reuse tới MAX
Một số function code quá phức tạp, hiện tại 2 class chính là bee và beeManager đã > 150 lines rồi !
Viết code ngắn ngọn thì càng đỡ lỗi.Rất nhiều hàm thừa !
Eg : Hoàn toàn không cần dùng các method dưới, tiết kiệm > 12 lines mà vẫn giữ nguyên chức năng !
public override string getBeeTypeName()
{
return "Drone";
}
Em nâng cấp tiếp thử xem !
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

FlyingFox
Guru
Guru
Bài viết: 770
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 311 time

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

Gửi bàigửi bởi FlyingFox » T.Năm 16/02/2012 9:17 am

Mình viết lại dựa trên code cũa bạn Đạt bằng cách tạo thêm enum cho Bee Type, viết code cho 2 function IsDeath và Damage ỡ trong class Bee bằng cách bõ đi từ khóa abstract cũa function.
Tập tin đính kèm
BeeOOP.zip
(82.22 KiB) Đã tải 407 lần

HaiPT
VIP
VIP
Bài viết: 251
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.Năm 16/02/2012 12:06 pm

Yes ,
FlyingFox phát hiện ra bản chất vấn đề rồi :) , vì đúng là các loại ong chỉ khác về MAX_ALLOWED_HEALTH !
Phiên bản của ĐẠT cho các lớp con override IsDeath là chưa tối ưu ! FlyingFox fix được điểm này tuy nhiên code vẫn còn ......quá dài
Do có khá nhiều chi tiết thừa !
( Lưu ý là không cần dùng LINQ để nhồi nhét các lệnh cho cùng 1 line )
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

FlyingFox
Guru
Guru
Bài viết: 770
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 311 time

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

Gửi bàigửi bởi FlyingFox » T.Sáu 17/02/2012 6:53 am

Sữa lại trong class BeeManager cho ngắn lại thêm 1 chút rồi đó không biết chũ topic có tính luôn comment trong code nữa hay không? Đồng thời code này dựa theo cũa bạn Đạt dùng WinForm cho dễ test cho nên mới dài hơn so với Console. Nhồi nhét thường dùng cho C# coder lắm hihi có lẽ nên nhiếu người thích C# hơn VB.NET đó.
Tập tin đính kèm
BeeOOP.zip
(80.83 KiB) Đã tải 333 lần

HaiPT
VIP
VIP
Bài viết: 251
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.Bảy 18/02/2012 10:48 pm

:) FF dùng LINQ là lách luật :)
Dù vậy code vẫn còn rất dài, cả beemanager + bee vẫn cần trên 80 lines !
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

FlyingFox
Guru
Guru
Bài viết: 770
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 311 time

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

Gửi bàigửi bởi FlyingFox » T.Ba 21/02/2012 6:41 pm

Vậy đến khi nào chũ topic mới đưa cái code đó cho mọi người xem đây?

HaiPT
VIP
VIP
Bài viết: 251
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 21/02/2012 8:22 pm

Tôi không thể đưa đáp án vì nghĩ ra một bài test và đáp án khác cũng sẽ rất mất thời gian ,tôi chỉ có thể đưa ra các nhận xét ,tuy nhiên bạn có thể tự tìm thấy đáp án nếu chịu khó tìm hiểu và đọc kỹ hướng dẫn !Muốn biết đáp án thì phải join khóa đào tạo nhân viên của FSOFT:).
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
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

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

Gửi bàigửi bởi vo_minhdat2007 » T.Ba 21/02/2012 8:51 pm

Hì hì, lâu rồi mà cũng chưa thấy ai trả lời tiếp, mấy hôm nay bận quá, hôm nay em xin đăng thử bài này.

Bài trước đúng như anh Hải nói là thừa nhiều cái (và thậm chí không dùng đến). Có lẽ do thói quen lập trình library cho end-developer em làm gần đây :D

Code này tuy < 60 lines, nhưng đổi lại mất tính trong sáng (khó đọc, do xoá chú thích và khoảng trắng/xuống dòng), khó bảo trì (do dùng mẹo, lấy biến Random từ bên ngoài để "ăn gian", bản thân code không cần tạo ra tốn 2 dòng), khó nâng cấp (do xoá gần hết hằng số). Mong nhận được ý kiến của anh :)

P.s: 1 câu hỏi nhỏ là giả sử em xin việc và em nộp bài như bài đầu tiên thì anh có nhận không :P
Tập tin đính kèm
BeeOOP.zip
(52.01 KiB) Đã tải 367 lần

HaiPT
VIP
VIP
Bài viết: 251
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 21/02/2012 10:11 pm

Thực ra chỉ cần làm như bài đầu tiên cũng là đạt yêu cầu rồi!
Vì với đối tượng Fresher làm được như vậy trong 40p đúng chức năng cũng là vấn đề... khá khó !
Bài mới của Đạt vẫn thừa khá nhiều , lạm dụng các trick về lệnh if để rút gọn dòng lệnh thật ra không nên dùng vì rất khó đọc!
Đạt đến mức độ code không thừa không thiếu, chính xác, dễ đọc, khỏi cần comment chắc cũng sẽ tốn thêm ít time đấy :)!
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

FlyingFox
Guru
Guru
Bài viết: 770
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 311 time

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

Gửi bàigửi bởi FlyingFox » T.Tư 22/02/2012 10:55 am

Lấy class name thay vì phãi dùng BeeType bằng cách viết this.mBeeManager.Bees[i].GetType().Name. Tỗng cộng vừa đũ 60 lines cho Bee + BeeManager.

[csharp]using System;
using System.Collections.Generic;
using System.Linq;

namespace BeeOOP
{
public class Bee
{
public Bee() { this.Health = 100; }
public float Health { get; set; }
protected float MinHealth { get; set; }

public bool IsDeath()
{
return this.Health < this.MinHealth;
}

public virtual void Damage(int percent)
{
if (this.IsDeath()) return;
this.Health = this.Health * (100 - percent) / 100;
}
}

public class Worker : Bee
{
public Worker() { this.MinHealth = 70; }
}

public class Queen : Bee
{
public Queen() { this.MinHealth = 20; }
}

public class Drone : Bee
{
public Drone() { this.MinHealth = 50; }
}

public class BeeManager
{
List<Bee> _bees = new List<Bee>();
Random rnd = new Random();

public List<Bee> Bees { get { return _bees; } }

public void InitializeList(int totalBeePerType)
{
_bees.Clear();
for (int i = 0; i < totalBeePerType; i++)
_bees.AddRange(new List<Bee> { new Worker(), new Queen(), new Drone() });
_bees = _bees.OrderBy(r => rnd.Next()).ToList<Bee>(); // Shuffle list
}

public void Attack(int maxDamage)
{
foreach (Bee b in _bees) b.Damage(rnd.Next(maxDamage + 1));
}
}
}[/csharp]

HaiPT
VIP
VIP
Bài viết: 251
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.Tư 22/02/2012 4:27 pm

COOL ! Không phải đáp án nhưng cách code của FF rất tốt rồi ! ( đây có thể là version cho NET 3.X ) =D>
Như vậy là các bạn thấy từ version đầu tiền, giờ code đã ngắn tới mức... không cần comment !
Tuy nhiên ..code này còn có thể rút ngọn 15 lines nữa ! :P
Try.. again! FF Thử viết lại , thêm cả phần xử lý UI nữa xem sao :) ( console Only )
Phạm Hải
Quản trị dự án ,Chuyên gia đào tạo
Đại học FPT

FlyingFox
Guru
Guru
Bài viết: 770
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 311 time

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

Gửi bàigửi bởi FlyingFox » T.Năm 23/02/2012 8:05 am

Xài sang một chút cũng không được ~X( , code gì chĩ viết có 60 lines mà lại không cần viết comment nữa. Muốn tiết kiệm sao? vậy thì dẹp bõ luôn thằng cha Manager tối ngày lãi nhãi hoài (dùng for each mấy lần chậm lắm).
  1. namespace BeeConsole
  2. {
  3.     public class Bee
  4.     {
  5.         public Bee() { this.Health = 100; }
  6.         public float Health { get; set; }
  7.         protected float MinHealth { get; set; }
  8.         public bool IsDeath() { return this.Health < this.MinHealth; }
  9.         public virtual void Damage(int percent)
  10.         {
  11.             if (!this.IsDeath()) this.Health = this.Health * (100 - percent) / 100;
  12.         }
  13.     }
  14.     public class Worker : Bee
  15.     {
  16.         public Worker()  { this.MinHealth = 70; }
  17.     }
  18.     public class Queen : Bee
  19.     {
  20.         public Queen() { this.MinHealth = 20; }
  21.     }
  22.     public class Drone : Bee
  23.     {
  24.         public Drone() { this.MinHealth = 50; }
  25.     }
  26. }


Lại còn bắt viết theo kiễu Console nữa chứ, từ đó đến giờ mình có làm theo kiễu này lần nào đâu. Vậy thì cứ viết đại cho xong luôn.
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace BeeConsole
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             int input = 0;
  11.             Random rnd = new Random();
  12.             List<Bee> bees = new List<Bee>();
  13.             while (true)
  14.             {
  15.                 Console.WriteLine("\nBee Game: 1 Reset\t2 Attack");
  16.                 if (Int32.TryParse(Console.ReadLine(), out input))
  17.                 {
  18.                     if (input < 1 | input > 2) break;
  19.                     if (input == 1 | bees.Count == 0)
  20.                     {
  21.                         bees.Clear();
  22.                         for (int i = 0; i < 10; i++)
  23.                             bees.AddRange(new List<Bee> { new Worker(), new Queen(), new Drone() });
  24.                         bees = bees.OrderBy(r => rnd.Next()).ToList<Bee>();       // Shuffle list
  25.                     }
  26.                     foreach (Bee b in bees)
  27.                     {
  28.                         if (input == 2) b.Damage(rnd.Next(81));
  29.                         Console.WriteLine(b.GetType().Name + "\t" + b.Health.ToString() + "\t" + (b.IsDeath() ? "Yes" : "No"));
  30.                     }
  31.                 }
  32.                 else break;
  33.             }
  34.         }
  35.     }
  36. }


Cộng lại cã hai thì 63 hàng đó, nếu mà gộp chung lại thành một file (chung namespace) thì vừa đũ 60 đó, :( chĩ ngồi đếm code được bao nhiêu hàng thì hết giờ rồi. Nếu mà chỗ này nhận nhiều người thì may lắm mới tới phiên mình.


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