كائنات Card
إذا لم تكن تعرف كيف تلعب الورق، فسيكون الآن وقتاً مناسباً لتشتري مجموعة ورق، وإلا فلن تفهم شيئاً من هذا الفصل. أو اقرأ http://en.wikipedia.org/wiki/Playing_card.
يوجد 52 ورقة لعب في المجموعة؛ كل منها تنتمي لأحد المنظومات الأربعة وواحدة من الرتب الثلاثة عشر. المنظومات هي: الاسباتي، كوبة، ديناري، والزهر (مرتبة تنازلياً بحسب قوتها في لعبة بريدج). الرتب هي آص، 2، 3، 4، 5، 6، 7، 8، 9، 10، صبي، بنت وشيخ. وبحسب اللعبة التي تلعبها، إما أن يعتبر الآص أعلى من الشيخ أو أدنى من 2.
إذا أردت تعريف صنف جديد لتمثيل أوراق اللعب، فمن الواضح أن متغيرات الحالة يجب أن تكون: rank (للرتبة)، وsuite (للمنظومة). لا يبدو نوع هذه المتغيرات واضحاً. من الاحتمالات الممكنة هو نوع String، ويمكن أن يحتوي على شيء مثل "Spade" لمنظومة الاسباتي و"Queen" لورقة البنت. من علل هذا الأسلوب هو صعوبة المقارنة بين الأوراق لنعرف أي منها أعلى رتبة أو منظومة.
من الحلول البديلة استخدام الأعداد الصحيحة لترميز (encode) الرتب والمنظومات. أنا لا أعني بكلمة "ترميز" التشفير أو التحويل إلى شفرة سرية، وهو ما قد يعتقده البعض. ما يعنيه عالم الكمبيوتر بكلمة "ترميز" هو شيء مثل "تحديد خريطة تربط بين سلسلة من الأرقام وبين أشياء أخرى أريد تمثيلها." مثلاً،
اسباتي ← 3
كوبة ← 2
ديناري ← 1
زهر ← 0
الميزة الواضحة لهذا التخطيط هي استبدال المنظومات بالأرقام الصحيحة بالترتيب، حتى نتمكن من مقارنة المنظومات بالمقارنة بين الأعداد الصحيحة. إن خريطة الرتب واضحة فعلاً؛ كل واحدة من رتب الأرقام ترتبط بالعدد الصحيح المقابل، وبالنسبة لأوراق الصور:
صبي ← 11
بنت ← 12
شيخ ← 13
إن سبب استخدامي للتدوين الرياضي لهذه الخرائط هو أنها ليست جزءاً من البرنامج. هي جزء من تصميم البرنامج، لكنها لن تظهر صراحة في الشفرة أبداً. تعريف الصنف للنوع Card يبدو مثل هذا:
كود:
class Card
{
int suit, rank;
public Card() {
this.suit = 0; this.rank = 0;
}
 
public Card(int suit, int rank) {
this.suit = suit; this.rank = rank;
}
}
كالعادة، أكتب عمليتين بانيتين: واحدة تأخذ معامل لكل متغير حالة؛ والثانية لا تأخذ أية معاملات.
لإنشاء كائن يمثل 3 الزهر، نستدعي new:
كود:
Card threeOfClubs = new Card(0, 3);
المتحول الأول، 0 يعبر عن منظومة الزهر.