عند تحليل الشيفرة التي قدمتها، يظهر أن المشكلة الرئيسية تكمن في استخدام الحقول الثابتة (static
) في فئة Candidate
. عندما تكون الحقول static
، فإنها تشترك بين جميع الكائنات من نفس الفئة، مما يؤدي إلى تأثير غير متوقع عند إنشاء كائنات فرعية من Candidate
في مثيل TestCandidate
.
لحل هذه المشكلة، يجب إزالة كلمة “static” من تعريف الحقول في فئة Candidate
، بحيث تصبح الفئة كالتالي:
javapublic class Candidate {
private String name;
private int numVotes;
Candidate(String name, int numVotes) {
this.name = name;
this.numVotes = numVotes;
}
// ... باقي الشيفرة
}
بعد هذا التغيير، ستتمكن من إنشاء كائنات فرعية من Candidate
بشكل صحيح، وستظهر النتائج كما هو متوقع.
المزيد من المعلومات
بعد التحليل الأولي للشيفرة البرمجية التي قدمتها، يمكن توفير المزيد من التوجيهات لتحسين البرنامج. إليك بعض المقترحات:
-
تعديل مراقبة الحلقة في
getTotal
:
في الوقت الحالي، تستخدم حلقةfor-each
للتجميع على جميع الأصوات. ومع ذلك، يجب عليك استخدام الكائنi
في كل تكرار بدلاً من استخدام الفئةCandidate
مباشرة. هذا يعني تحسين دورةgetTotal
كما يلي:javapublic static int getTotal(Candidate[] election) { int total = 0; for (Candidate candidate : election) { total += candidate.getVotes(); } return total; }
-
تعديل دورة
printResults
:
في دورةprintResults
، تستخدم مرة أخرى الفئةCandidate
بدلاً من استخدام الكائنi
. يجب تصحيح هذا لضمان طباعة نتائج صحيحة لكل مرشح. هنا التعديل المقترح:javapublic static void printResults(Candidate[] election) { System.out.printf("%s%12s%25s", "Candidate", "Votes", "Percentage of Votes\n"); for (Candidate candidate : election) { System.out.printf("\n%s%10s%10s", candidate.getName(), candidate.getVotes(), ((double) candidate.getVotes() / getTotal(election) * 100)); } System.out.println("\n\nTotal Number of Votes: " + getTotal(election)); }
-
تعديل دورة
addCandidates
:
في دورةaddCandidates
، يمكنك تحسينها لتقوم بتهيئة الكائنات داخل الفئةTestCandidate
بدلاً من تمرير المصفوفة كمعامل. هذا يجعل الشيفرة أكثر قابلية للصيانة والفهم.javapublic class TestCandidate { public static Candidate[] election = new Candidate[5]; static { election[0] = new Candidate("John Smith", 5000); election[1] = new Candidate("Mary Miller", 4000); election[2] = new Candidate("Michael Duffy", 6000); election[3] = new Candidate("Tim Robinson", 2500); election[4] = new Candidate("Joe Ashton", 1800); } // باقي الشيفرة }
هذه التحسينات يمكن أن تساعد في جعل البرنامج أكثر وضوحًا وسهولة في الصيانة.