
مرحبًا بكم في تخزين البرمجة الموجهة نحو كائن مع Java ! يوفر موردًا شاملاً لاستكشاف وتعلم البرمجة الموجهة من خلال لغة Java.
البرمجة الكائنات الموجهة (OOP - OOP - OOP -ORIDERADING) هي نموذج برمجة شهير يستخدم على نطاق واسع في تطوير البرمجيات. يعتمد على مفاهيم "الكائنات" ، وهي كيانات تجمع بين كلتا البيانات (السمات) والطرق (السلوكيات). يركز OOP على تصميم البرامج استنادًا إلى الكائنات التفاعلية ، بدلاً من العملية والمنطق كما في البرمجة الإجرائية.
تعتمد البرمجة الموجهة نحو الكائن على 4 مبادئ أساسية ، وهي: التغليف ، والميراث ، وتعدد الأشكال ، والملخص. يوفر كل من هذه المبادئ مقاربة لحل المشكلات في تطوير البرمجيات والمساعدة في إدارة التعليمات البرمجية المصدر بشكل أكثر فعالية.
1. التغليف : هذا هو مفهوم إخفاء تفاصيل النشر الداخلية للكائن ، مما يمنع المستخدمين مباشرة من الوصول إلى البيانات داخل. يساعد التغليف على حماية بيانات وسلوك الكائن من التدخل غير المرغوب فيه وتوفر واجهة موحدة للتفاعل مع الكائن.
// Lớp Employee (Nhân viên) chứa các thuộc tính: tên, tuổi, lương
public class Employee {
// Các biến dữ liệu riêng tư để ngăn chặn truy cập trực tiếp từ bên ngoài lớp
private String name ;
private int age ;
private double salary ;
// Constructor (hàm tạo) để khởi tạo các giá trị của đối tượng
public Employee ( String name , int age , double salary ) {
this . name = name ;
this . age = age ;
this . salary = salary ;
}
// Các phương thức getter để truy cập các biến dữ liệu
public String getName () {
return name ;
}
public int getAge () {
return age ;
}
public double getSalary () {
return salary ;
}
// Các phương thức setter để cập nhật giá trị của các biến dữ liệu
public void setName ( String name ) {
this . name = name ;
}
public void setAge ( int age ) {
this . age = age ;
}
public void setSalary ( double salary ) {
this . salary = salary ;
}
}
// Lớp Main để thực thi mã
public class Main {
public static void main ( String [] args ) {
// Tạo đối tượng của lớp Employee
Employee emp = new Employee ( "John Doe" , 30 , 50000 );
// Truy cập và cập nhật thông qua các phương thức getter và setter
System . out . println ( "Employee name: " + emp . getName ());
emp . setSalary ( 55000 );
System . out . println ( "Updated salary: " + emp . getSalary ());
}
} في هذا المثال ، يتم وضع علامة على name المتغيرات age salary على أنها private ، مما يعني أنه لا يمكن الوصول إليه مباشرة من خارج Employee . بدلاً من ذلك ، يتم توفير getName() ، getAge() ، getSalary() ، setName() ، setAge() ، و setSalary() للوصول إلى قيمة هذه المتغيرات وتحديثها ، مما يضمن التغليف.
2. الميراث (الميراث): يسمح الميراث بطبقة جديدة بخصائص وطرق وراثة من طبقة موجودة. يمكن لهذه الطبقة الجديدة إضافة أو تعديل مكونات الميراث لتلبية احتياجاتها الخاصة ، والمساعدة في إعادة استخدام التعليمات البرمجية المصدرية وتوسيعها بفعالية.
// Lớp cơ sở (hay lớp cha): Employee
public class Employee {
private String name ;
private int age ;
// Constructor của lớp Employee
public Employee ( String name , int age ) {
this . name = name ;
this . age = age ;
}
// Getter và Setter
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public int getAge () {
return age ;
}
public void setAge ( int age ) {
this . age = age ;
}
// Phương thức để hiển thị thông tin
public void displayInfo () {
System . out . println ( "Name: " + name + ", Age: " + age );
}
}
// Lớp dẫn xuất (hay lớp con): Manager kế thừa từ Employee
public class Manager extends Employee {
private double salary ;
// Constructor của lớp Manager
public Manager ( String name , int age , double salary ) {
super ( name , age ); // Gọi constructor của lớp cơ sở (lớp cha)
this . salary = salary ;
}
// Phương thức mới của lớp Manager
@ Override
public void displayInfo () {
// Gọi phương thức displayInfo của lớp cơ sở (lớp cha)
super . displayInfo ();
System . out . println ( "Salary: " + salary );
}
}
public class Main {
public static void main ( String [] args ) {
// Tạo đối tượng Manager
Manager manager = new Manager ( "Alice Johnson" , 42 , 75000 );
manager . displayInfo (); // Hiển thị thông tin của Manager
}
}Employee هي فئة أساسية تحتوي على معلومات أساسية مثل الاسم والعمر.Manager هي فئة المشتق من Employee وتضيف سمة salary .Manager الكلمات الرئيسية extends إلى الوراثة من فئة Employee . مُنشئ Manager يسمى super(name, age) ؛ لتهيئة الخصائص الموروثة من فئة Employee .displayInfo() في فئة Manager لإضافة المزيد من المعلومات حول الراتب ، واتصل طريقة displayInfo() للفئة الأساسية لعرض المعلومات الأساسية.3. تعدد الأشكال : تعدد الأشكال هو القدرة التي يمكن من خلالها استخدام فئات مختلفة من خلال نفس الواجهة. يمكن تعريف الطريقة في طبقة أساسية ويتم استبدالها بطرق نفس الاسم في الفئات المشتقة ، مما يسمح بمعالجة الكائنات من خلال الواجهة المشتركة دون معرفة نوع البيانات المحددة.
في Java ، يتم التعبير عن تعدد الأشكال من خلال طريقة المتراكبة في التراجع وإعادة شحن الطريقة (التحميل الزائد للأسلوب).
class Animal {
void speak () {
System . out . println ( "Animal speaks" );
}
}
// Lớp Dog (chó) kế thừa lớp Animal (động vật)
class Dog extends Animal {
// Lớp Dog ghi đè phương thức speak() của lớp cha
@ Override
void speak () {
System . out . println ( "Dog barks" );
}
}
// Lớp Cat (mèo) kế thừa lớp Animal (động vật)
class Cat extends Animal {
// Lớp Dog ghi đè phương thức speak() của lớp cha
@ Override
void speak () {
System . out . println ( "Cat meows" );
}
}
public class Main {
public static void main ( String [] args ) {
Animal myAnimal = new Animal ();
Animal myDog = new Dog ();
Animal myCat = new Cat ();
myAnimal . speak (); // Prints "Animal speaks"
myDog . speak (); // Prints "Dog barks"
myCat . speak (); // Prints "Cat meows"
}
} في هذا المثال ، يتم كتابة طريقة speak() في طبقات Dog Cat . عند استدعاء طريقة speak() على كائن الطفل ، تحدد Java الطريقة التي سيتم استدعاؤها في وقت التشغيل ، اعتمادًا على نوع الكائن الذي يأتي المتغير المرجعي.
class Printer {
// In chuỗi
void print ( String data ) {
System . out . println ( "String: " + data );
}
// In số nguyên
void print ( int data ) {
System . out . println ( "Integer: " + data );
}
// In số thực
void print ( double data ) {
System . out . println ( "Double: " + data );
}
}
public class Main {
public static void main ( String [] args ) {
Printer printer = new Printer ();
// Gọi phương thức print nạp chồng
printer . print ( "Hello, World!" );
printer . print ( 123 );
printer . print ( 98.76 );
}
}Printer على ثلاثة إصدارات من طريقة print ، كل معالجة نوع بيانات محدد: String و int و double .print ، ستحدد Java الإصدار المناسب بناءً على نوع البيانات في وسيطة الإرسال.يتم التعبير عن تعدد الأشكال بوضوح من خلال آلية استخدام الواجهة. الواجهة في Java هي وسيلة لتحقيق تعدد الأشكال الأعلى ، مما يسمح للطبقة بنشر العديد من الواجهات والواجهة التي يمكن نشرها بواسطة طبقات مختلفة.
لنفترض أن لدينا واجهة CanFly وطبقتين Bird Airplane كلا من تنفيذ هذه الواجهة:
interface CanFly {
void fly ();
}
class Bird implements CanFly {
public void fly () {
System . out . println ( "The bird flaps its wings to fly." );
}
}
class Airplane implements CanFly {
public void fly () {
System . out . println ( "The airplane turns on its engines to fly." );
}
}
public class TestPolymorphism {
public static void main ( String [] args ) {
CanFly myBird = new Bird ();
CanFly myAirplane = new Airplane ();
myBird . fly (); // Output: The bird flaps its wings to fly.
myAirplane . fly (); // Output: The airplane turns on its engines to fly.
}
}CanFly طريقة fly() دون توفير الجسم.Bird Airplane تنشر طريقة fly() بطريقتها الخاصة.myBird و myAirplane من خلال CanFly الواجهة ، وعند استدعاء طريقة fly() ، يسمح لنا تعدد الأشكال بعدم الاهتمام بكائن الكائن ؛ نحن نعرف فقط أنه يمكنهم الطيران.4. التجريد : يسمح الملخص للمبرمجين بالتركيز على ما يفعله كائن ما دون رعاية كيفية القيام بذلك. إنه ينشئ فئة أساسية تصف واجهة عامة ستنفذها الطبقات المشتقة ، مما يؤدي إلى تبسيط إدارة تعقيد النظام.
في Java ، يمكن إجراء الملخص بطريقتين:
الفئة التجريدية هي كائن لا يمكن إنشاؤه ويمكن أن يحتوي على أساليب مجردة بدون جسم.
abstract class Animal {
// Phương thức trừu tượng
abstract void makeSound ();
// Phương thức bình thường
void breathe () {
System . out . println ( "Breathing..." );
}
}
class Dog extends Animal {
// Triển khai phương thức trừu tượng trong lớp con
void makeSound () {
System . out . println ( "Bark" );
}
}
public class Main {
public static void main ( String [] args ) {
Animal myDog = new Dog ();
myDog . makeSound (); // In ra "Bark"
myDog . breathe (); // In ra "Breathing..."
}
}Animal هو طبقة مجردة ذات طرق تجريدية makeSound() .Dog هو فئة ورثية من Animal ويجب أن توفر نشرًا محددًا للطريقة المجردة makeSound() .الواجهة (الواجهة) يمكن أن تحتوي فقط على طرق مجردة دون نشر.
interface Vehicle {
void start ();
void stop ();
}
class Car implements Vehicle {
public void start () {
System . out . println ( "Car starting" );
}
public void stop () {
System . out . println ( "Car stopping" );
}
}
class Bike implements Vehicle {
public void start () {
System . out . println ( "Bike starting" );
}
public void stop () {
System . out . println ( "Bike stopping" );
}
}
public class Main {
public static void main ( String [] args ) {
Vehicle myCar = new Car ();
Vehicle myBike = new Bike ();
myCar . start (); // In ra "Car starting"
myCar . stop (); // In ra "Car stopping"
myBike . start (); // In ra "Bike starting"
myBike . stop (); // In ra "Bike stopping"
}
} هنا ، Vehicle هي واجهة تحدد طريقتين مجردين: start() و stop() . تنشر طبقات Car Bike هذه الواجهة وتوفر نشرًا محددًا لكل طريقة.
تشابه:
الاختلافات:
| فئة مجردة | واجهة | |
|---|---|---|
| غاية | - غالبًا ما يتم استخدامها عندما يكون للفئات الفرعية العديد من الوظائف الشائعة وتحتاج إلى مكان مشترك لوضع الكود الذي يمكن إعادة استخدامه. -مساعدة في تحديد نمط أساسي للصفوف الفرعي ، تأكد من أن جميع الفطائر الفرعية ترثها لمتابعة التصميم الشائع. | - غالبًا ما تستخدم لتحديد عقد لوظيفة دون الاهتمام. - مثالي للوظائف التي يمكن تنفيذها مختلفة تمامًا. - جيد لتعريف أساليب التجميع التي يمكن أن يؤديها الفصل. |
| النشر | - يمكن أن تحتوي على كل من الأساليب التجريدية (لا جسم) وطرق غير المجردة (مع الجسم). - يمكن أن تحتوي الفئات التجريدية أيضًا على حقول بيانات ومقدمات. | - في البداية ، فإنه يسمح فقط بتعريف الأساليب المجردة بدون الجسم. - من Java 8 فصاعدًا ، تسمح الواجهة أيضًا بتعريف طرق الجسم من خلال الطرق الافتراضية والطرق الثابتة. |
| متعددة | - لا يمكن للصف إلا أن يرث من طبقة مجردة واحدة. - هذا يحد من مرونة multi -Inheritance كما هو الحال في الواجهة. | - يسمح Java للطبقة بأداء واجهات متعددة في نفس الوقت ، مما يوفر نموذجًا متعدد الأطوار. |
| فك | - قد تكون هناك قيود ، مما يساعد على تعيين الشروط الأولية للفصل. | - لا يوجد مُنشئ. |
| حقل البيانات | - على عكس الواجهة ، قد تحتوي الفئات المجردة على حقول بيانات ليست إحصائية ونهائية. - قد يكون للطبقة الفرعية سمات منفصلة موروثة من الطبقة المجردة. | - لا تدعم الواجهة حقل البيانات ثابتًا ونهائيًا. - تعتبر جميع المتغيرات المعلنة في الواجهة تلقائيًا النهائي الثابت العام. |
تجلب البرمجة الموجهة نحو الكائنات العديد من المزايا المتميزة في تطوير البرمجيات ، مما يجعلها واحدة من نماذج التصميم والبرمجة الرئيسية في صناعة تكنولوجيا المعلومات. فيما يلي مزايا ذلك:
إعادة استخدام الكود : يسمح OOP للمبرمجين بإعادة استخدام رمز المصدر من خلال آلية الميراث. يمكن لطبقة الطفل أن ترث الميزات من فئة الأب دون إعادة كتابة هذا الرمز. هذا يساعد على تقليل عمل البرمجة ، وتقليل الأخطاء المحتملة وتسريع تطوير البرمجيات.
من السهل الحفاظ على الأخطاء وإصلاحها : يساعد هيكل التغليف في OOP على إخفاء تفاصيل النشر ، فقط توفير الواجهة (الواجهة) اللازمة للمستخدمين. هذا يجعل صيانة النظام وتحديثه أسهل ، لأن التغيير داخل كائن ما لا يؤثر على كائنات أخرى.
النمذجة العملية : يسمح OOP للبرمجة بنمذجة الكيانات الحقيقية في شكل كائنات برمجيات ، مما يجعل الكود المصدري أسهل في الفهم والإدارة. يساعد استخدام كائنات مثل إجراء البيانات والسلوكيات في العالم الحقيقي على تطوير البرامج لتصبح أكثر سهولة وأقرب إلى المبرمج.
التوسع : بفضل القدرة على الوراثة والحزمة ، من السهل التوسع OOP. يمكن إنشاء طبقة جديدة مع ميراث من طبقة أو أكثر موجودة دون التأثير على تلك الطبقات. هذا يساعد النظام على النمو بمرونة والتكيف مع الاحتياجات الجديدة بسرعة.
الأمن : لا تساعد التغليف فقط في إخفاء تفاصيل التنفيذ ولكن يوفر أيضًا طبقة أمان. البيانات الموجودة داخل كائن محمية من الوصول المباشر الخارجي ، مما يضمن سلامة وسلامة البيانات.
Java هي واحدة من لغات البرمجة الأكثر شعبية المستخدمة لتدريس البرمجة الموجهة نحو الكائن لأسباب معقولة.
Java هي لغة موجهة كائنًا نقيًا ، مما يعني أن كل شيء في جافا هو كائن أو فئة. مفاهيم مثل الميراث ، والتغليف ، وتعدد الأشكال ، والملخص مدمجة تمامًا في لغة. هذا يساعد المتعلمين بسهولة على الوصول إلى مبادئ OOP وممارسة بشكل طبيعي أثناء البرمجة.
Java لديها بناء جملة واضحة وسهلة الفهم. يعتمد بناء جملة Java على C/C ++ ، لكنه أزال بعض الميزات المعقدة مثل المؤشر المباشر ، مما يجعلها لغة مثالية لتعليم المبتدئين. يساعد القضاء على هذه الميزات المعقدة للمتعلمين على التركيز على فهم المفاهيم الأساسية لـ OOP دون أن يتعثروا في التفاصيل المربكة.
Java هي مؤسسة لغة مستقلة ، ويمكن تشغيلها على أي نظام تشغيل مع الجهاز الظاهري Java (JVM). هذا يعني أن برامج Java يمكنها تطوير وتنفيذ باستمرار على منصات مختلفة دون تغيير الكود. هذه المرونة مثالية لبيئة التعلم ، حيث يمكن للطلاب والمعلمين استخدام مجموعة متنوعة من الأجهزة والبرامج.
أثناء استخدام هذا الأرشيف للتعلم ، يجب عليك اتباع مبدأ الترتيب المذكور أدناه. اقرأ العناصر وفقًا للقواعد من أعلى إلى أسفل ، ستكون الأجزاء الأولى هي أساس المحتوى التالي. لا سيما بالنسبة للملحق الذي يمكنك الرجوع إليه في أي وقت ، فإنه يحتوي على بعض الكتب التي أستخدمها لتصميم هذا الأرشيف.
لمزامنة وتكون سهلة التحكم ، تحتوي الطبقة الرئيسية على الطريقة الرئيسية لتنفيذ الكود مثل محتوى الدرس. فصول أخرى في الدرس لتوضيح. على سبيل المثال ، يكون الدرس حول الواجهة موجودًا في
Interface.javaله فئات:Movable،Trackable،Drone،Interface، فئاتMovable،Trackable،Droneلها تأثير على معرفة الدرس ، وفئاتInterfaceلتنفيذ التعليمات البرمجية من الفئات السابقة.
هذا العنصر هو نفس الترتيب تقريبًا مثل التخزين الخاص بي: بنية البيانات والخوارزمية باستخدام C/C ++ ، باستثناء ذلك المكتوب بلغة Java. سيكون هناك بعض الاختلافات بين اللغتين ، يمكن للقراء مقارنةهما بأنفسهم.
Java هي لغة برمجة وترجمة ( وتفسيرها . في Java ، تتم ترجمة الكود المصدر إلى رمز Bytecode ، وهو مؤشرات ثنائية بسيطة تعمل مثل رمز الكمبيوتر لأجهزة الكمبيوتر. ومع ذلك ، على عكس C أو C ++ ، فإن رمز Bytecode الخاص بـ Java ليس هو رمز الآلة الأصلي لأي معالج محدد ولكن بالنسبة لآلة Java (JVM).
ثم تمت ترجمة هذا الرمز BYTECODE وتنفيذه بواسطة الجهاز الظاهري Java كما لو كان رمز الجهاز الأصلي. يعمل JVM مثل نظام التشغيل النشط في إدارة أوامر الذاكرة والمعالجة ، مما يضمن سلامة الرمز والهاتف المحمول. يتم تعريف جميع خصائص لغة Java بوضوح ، بغض النظر عن النظام المحدد للنظام الأساسي ، مما يساعد Java على أن تكون قادرًا على تشغيل العديد من المنصات المختلفة دون تحرير التعليمات البرمجية.
يوفر JVM بيئة إنفاذ آمنة ، حيث تؤدي وظائف مماثلة لنظام التشغيل. يدير الذاكرة ، وتنفيذ الأوامر بناءً على أكوام ، ومعالجة أنواع المياه. هذا يقلل من المخاطر الأمنية ويزيد من استقرار التطبيق.
سواء كان يشبه C و C ++ من حيث بناء الجملة ، فإن Java ليس سليلًا مباشرًا لـ C أو الإصدار التالي من C ++. لدى Java بشكل أكبر مع اللغات الديناميكية مثل SmallTalk و Lisp بدلاً من C. لا يتوقف التشابه إلا عند بناء الجملة الخارجي مثل استخدام العديد من الأقواس والأقواس. ترث Java فلسفة C للغة الجيدة التي يجب أن تكون مضغوطة ، وسهلة التذكر ولكن توسع المفردات من خلال حزم فئة Java.
تحظى لغات البرنامج النصي مثل Perl و Python و Ruby بشعبية كبيرة لأنها مناسبة للتطبيقات الآمنة والشبكات. ومع ذلك ، فإن معظم لغات النصوص غير مصممة للبرمجة الكبيرة الخطيرة. غالبًا ما تكون مناسبة للمشاريع الكبيرة أو المعقدة بسبب بنية البرنامج الفضفاضة ونظام البيانات البسيط.
توفر Java منصة آمنة لتطوير أطر عالية المستوى وحتى اللغات الأخرى ، حيث تجمع بين البساطة وميزات Java التي تتيح التطوير السريع والسهل للتطبيقات. تعلمت Java أيضًا من ميزات SmallTalk وتحسينها ، خاصة في استخدام مجموعة اختبار Bytecode لضمان دقة رمز الحملة ، مما يساعد على تحسين الأداء وضمان السلامة من SmallTalk.
تم تصميم Java لتكون لغة آمنة ، ليس فقط ضد أخطاء البرمجيات ولكن أيضًا المشكلات الشائعة في التصميم والبرمجة. تقدم Java العديد من الطبقات الواقية ، من اختبار أمان الكود قبل التشغيل إلى الطريقة التي يتم بها تحميل محمل الفئة ، آلية تحميل بايت من تفسير Java ، مما يخلق "جدارًا" حول الطبقات غير الموثوقة. هذه الميزات هي الأساس لسياسات الأمان عالية المستوى ، مما يسمح أو لا تسمح بأنواع مختلفة من الأنشطة في كل تطبيق.
تبدأ Java من "اللوحة البيضاء" ، وبالتالي يمكنها تجنب الميزات المعقدة أو المثيرة للجدل بلغات أخرى. على سبيل المثال ، لا تسمح Java للمبرمجين بتجديد المشغلين (مثل + Hay -) ، ولا توجد أموال معالجة الأموال مثل وحدات الماكرو أو بيانات #Define ، وهي الأشياء التي يتم استخدامها غالبًا بلغات أخرى لدعم الاعتماد على المنصة.
يوفر Java أيضًا بنية حزمة واضحة لتنظيم ملفات الفصول الدراسية ، مما يساعد عملية التجميع على التعامل مع بعض وظائف الأداة التقليدية التي صنعت بشكل فعال. يتم الحفاظ على جميع معلومات نوع البيانات في فئات Java المترجمة ، دون الحاجة إلى ملفات عنوان المصدر الزائد كما في C/C ++. هذا يجعل كود Java أسهل في القراءة والسياق أقل.
يدعم Java الوراثة فقط (كل فصل له فئة "أب" واحدة فقط) ولكنه يسمح براالة العديد من الواجهات. تحدد الواجهة في Java ، على غرار الطبقة المجردة في C ++ ، سلوك كائن ما دون الدفاع عن تنفيذها. هذه آلية قوية تسمح للمطور بتحديد "عقد" لسلوك الكائن الذي يمكن استخدامه والإشارة إليه بشكل مستقل إلى أي تنفيذ كائن محدد.
تقوم Java بإلغاء استخدام المؤشرات التي يمكن أن تشير إلى أي منطقة ذاكرة وتضيف تجميع القمامة تلقائيًا وقطعة عالية المستوى. تساعد هذه الميزات في التخلص من العديد من المشكلات المتعلقة بالسلامة والتحويل والتحسين الذي تواجهه اللغات الأخرى غالبًا. في Java ، ستعمل الأشخاص الذين لم تعد مستخدمة على استعادة الذاكرة تلقائيًا ، وتقليل أخطاء إدارة الذاكرة اليدوية.
لا تستخدم Java المؤشر التقليدي ولكن بدلاً من ذلك تكون مرجعًا أكثر ضيقة وأكثر أمانًا. يتم الوصول إلى الموضوعات في Java ، باستثناء الأنواع البدائية ، من خلال المرجع. يتيح ذلك إنشاء هياكل البيانات المعقدة بأمان في نوع البيانات دون مخاطر متعلقة بالمؤشر في C/C ++.
تم تصميم Java للتعامل مع الأخطاء بطريقة ذكية وفعالة ، وذلك بفضل آلية إدارة الاستثناء القوية. في Java ، لا يتم التقاط الأخطاء ومعالجتها فقط في مكان معين في البرنامج من خلال كتلة رمز "catch" ، ولكن أيضًا معبأة في استثناءات. يجلب كل من هذه الكائنات معلومات حول سبب الخطأ ، مما يجعل من السهل على المبرمجين فهم الأخطاء والتعامل معها بشكل صحيح. تتطلب ترجمة Java الطريقة لإعلان الاستثناءات التي قد تنشأ ، أو للتعامل معها على الفور. يساعد هذا في رفع معلومات الخطأ إلى نفس المستوى مع معلومات أخرى مثل نوع بيانات الإرجاع أو طريقة الطريقة. وبالتالي ، عند البرمجة ، يمكنك التنبؤ بالمواقف المحتملة والاستعداد لها ، مع التأكد من أن تطبيقك سيعمل أكثر استقرارًا وأكثر أمانًا.
في برمجة البرمجيات وتطويرها ، تعد اتفاقية التسمية مجموعة من القواعد لاختيار أسماء المتغيرات والفكين والفئات والكائنات الأخرى في الكود المصدري. تجعل اتفاقية التعريف رمز المصدر أسهل في القراءة ، وسهلة الفهم وأسهل في الحفاظ عليها. تخزين بلدي يتوافق بدقة مع هذه الاتفاقية ، المذكورة أدناه.
الفصل: يبدأ اسم الفصل دائمًا بالحرف المطبوع (Pascalcase). إذا كان اسم الفصل يتكون من العديد من الكلمات ، فيجب أن تبدأ كل كلمة أيضًا بالطباعة الأزهار. على سبيل المثال: Student ، Car ، ColorChooser .
الواجهة: مثل الفئة ، يستخدم اسم الواجهة أيضًا Pascalcase. غالبًا ما يبدأ اسم الواجهة بأحرف رأسمالية مثل I أو استخدم اللاحقة الغبية/اللاحقة مثل able أو ible لوصف الميزة ، مثل Runnable ، Accessible .
تبدأ طريقة الطريقة دائمًا في الحروف العادية وتتبع Camelcase. عادة ما يكون اسم الطريقة هو عبارات الأفعال أو الفعل التي تصف الإجراء الذي تنفذه الطريقة. على سبيل المثال: getName() ، calculateTotalWidth() .
يجب أن يبدأ الاسم المتغير أيضًا بالأحرف العادية ويتبعه Camelcase. يجب أن يكون الاسم المتغير واضحًا ووصف القيمة التي يمثلونها. على سبيل المثال: height ، numberOfStudents .
مثال على فئة Dog :
package com . example . animals ;
/**
* A generic Dog class that can be used as a base class for specific breeds.
*/
public class Dog {
private String name ;
private int age ;
/**
* Constructor for Dog class.
*
* @param name The name of the dog.
* @param age The age of the dog.
*/
public Dog ( String name , int age ) {
this . name = name ;
this . age = age ;
}
/**
* Returns the name of the dog.
*
* @return The name of the dog.
*/
public String getName () {
return name ;
}
/**
* Sets the name of the dog.
*
* @param name New name for the dog.
*/
public void setName ( String name ) {
this . name = name ;
}
/**
* Returns the age of the dog.
*
* @return The age of the dog.
*/
public int getAge () {
return age ;
}
/**
* Sets the age of the dog.
*
* @param age New age for the dog.
*/
public void setAge ( int age ) {
this . age = age ;
}
/**
* Provides a string representation of the dog.
*
* @return A string describing the dog's details.
*/
@ Override
public String toString () {
return "Dog[name=" + name + ", age=" + age + "]" ;
}
}| مؤشرات الوصول | عام | محمية | تقصير | خاص | |
|---|---|---|---|---|---|
| جنبا إلى جنب مع الحزمة | داخل الفصل | يملك | يملك | يملك | يملك |
| الفئة الفرعية | يملك | يملك | يملك | لا | |
| فئة أخرى | يملك | يملك | يملك | لا | |
| حزمة مختلفة | الفئة الفرعية | يملك | يملك | لا | لا |
| فئة أخرى | يملك | لا | لا | لا | |
لغة النمذجة الموحدة (UML) هي أداة نمذجة رسومية قياسية ، مصممة لرسم ووصف ومستندات حول جوانب مختلفة من برنامج التطبيق. إنه مفيد بشكل خاص في مجال البرمجة الموجهة للكائن ، لأنه يوفر طريقة بديهية لإظهار الفئات والكائنات والعلاقات بينهما. يتضمن UML العديد من الأنواع المختلفة من الرسوم البيانية ، ولكن في سياق البرمجة الموجهة للكائنات ، مخطط الفئة (مخططات الفئة) والرسوم البيانية التفاعلية (مخططات التفاعل) هما النوعان الأكثر استخدامًا.
يسمح UML للمبرمجين بوصف بنية النظام باستخدام مخططات الفصل. يعرض هذا الرسم البياني فئات في النظام ، والسمات ، وطرقها ، والأهم من ذلك ، العلاقة بين فئات مثل الميراث والربط والتوليف والمجموعة. هذا يساعد المبرمجين على فهم نظام وتصميم بشكل أكثر منهجيًا.
بمجرد الانتهاء من مخطط UML ، يمكن استخدامه كأساس لكتابة رمز المصدر. في OOP ، يكون النقل من مخطط الطبقة إلى رمز المصدر (عادةً Java أو C#أو C ++) مباشرة تمامًا ، نظرًا للتشابه بين المفاهيم الموضحة في UML وهيكل الطبقة في لغات البرمجة هذه.
يساعد UML على تحديد العلاقات بين الكائنات ، وتسليط الضوء على طريقة الاتصال والتفاعل بينها من خلال مخطط التسلسل (مخططات التسلسل) ومخطط التعاون (مخططات التعاون). هذا يساعد المبرمجين على فهم تدفق البيانات والتحكم في التطبيق.
قبل البدء في كتابة الرموز ، تساعد UML مجموعة التطوير على اكتشاف وتصحيح مشاكل التصميم. تساعد الوحدة في استخدام UML أيضًا الأعضاء في المجموعة على فهم أفكار بعضهم البعض بسهولة ، وبالتالي زيادة كفاءة التنسيق العاملة.
يوفر UML مستندات كاملة للبرنامج ، وهو مفيد للغاية في مرحلة الصيانة وترقية البرامج. يمكن أن يساعد مخطط UML الجيد الأشخاص الجدد المشاركين في المشروع على التقاط بنية النظام ووظيفة النظام بسرعة.
يعد الرسم البياني للفئة (مخطط الفئة) أحد أنواع المخططات المستخدمة في UML ويلعب دورًا مهمًا في نمذجة نظام البرمجيات. يوفر Drass Diagram نظرة عامة على بنية التطبيق من خلال عرض طبقات النظام وسماتها وطرقها والعلاقة بين تلك الطبقات. قد تشمل هذه العلاقات: الارتباط (الارتباط) ، الميراث (الميراث) ، الإنفاذ (الإدراك) ، التبعية ، aggrease ، التكوين.
يمثل الفصل مفهومًا يتضمن الحالة (السمة) والسلوك (الطريقة). كل سمة لها نوع واحد. كل طريقة لها توقيع. اسم الفصل هو المعلومات الإلزامية الوحيدة.
النظر في المثال التالي:

يتوافق مخطط UML هذا مع Animal الفئة في الكود على النحو التالي:
public class Animal {
// Các thuộc tính của lớp
public String name ; // Biến thành viên công khai cho tên
private int age ; // Biến thành viên riêng tư cho tuổi
private String species ; // Biến thành viên riêng tư cho loài
// Phương thức getter cho thuộc tính name
public String getName () {
return name ;
}
// Phương thức setter cho thuộc tính name
public void setName ( String name ) {
this . name = name ;
}
} الرموز + و - و # و # و # والطريقة في طبقة تشير إلى مستوى سعة الوصول للسمة والطريقة. خاصة:
+ إلى سمة أو طريقة عامة (عامة).- الإشارة إلى الخصائص أو طرق الخصوصية (خاصة).# يشير إلى الخاصية أو طريقة الحماية (محمية).
Flyable باستخدام طريقة fly() ، يمكن لفئة Bird تنفيذ هذه الواجهة عن طريق نشر طريقة fly() .School العديد من الأشياء في فصل Teacher ، لكن المعلمين لا يزالون موجودين بشكل مستقل عن المدرسة.House على العديد من كائنات Room . عند إلغاء House ، سيتم إلغاء Room أيضًا.| الميراث | يجتمع | |
|---|---|---|
| يُعرِّف | - الميراث هو آلية يمكن أن ترث فيها طبقة واحدة (تسمى الطبقة الفرعية) طبيعة وطريقة طبقة أخرى (تسمى الطبقة الأصل). - اسمح للتقسيم الفرعي بإعادة استخدام رمز الأب دون إعادة كتابة. - المقابلة لعلاقة "IS-A". | - العنصر هو شكل من أشكال العلاقة "هناك" بين طبقتين. - يشير إلى وجود علاقة قد يحتوي عليها كائن أو يشير إلى كائنات أخرى ، ولكن قد يوجد الموضوعان بشكل مستقل. - المقابلة لعلاقة "HAS-A". |
| غاية | - أعد استخدام الكود وتحسين وحدة التطبيق. - دعم أيضًا تعدد الأشكال ، مما يسمح لطريقة الطفل بأن يكون قادرًا على الكتابة أو توسيع طريقة الفئة الأصل. - على سبيل المثال: تحتوي الطبقة الحيوانية على طريقة () ، يمكن لفصول الطيور والأسماك أن ترث الحيوانات والاستخدام أو تجاوز طريقة Move () لتناسب طبيعتها المتحركة. | - تمثيل العلاقة بين الكائنات ، حيث قد يكون للكائنات علاقة جزئية مع بعضها البعض ولكن لا تعتمد تمامًا على بعضها البعض. - المساعدة في تعزيز المرونة في بنية البيانات وإدارة الكائنات المعقدة. - على سبيل المثال ، قد تحتوي الطبقة المربعة على كائنات من طبقة النقطة. يتكون كل مربع من أربعة كائنات من طبقة النقطة (التي تشير إلى القمم) ولكن قد توجد النقاط بشكل مستقل دون ذروة المربع. |
| الاعتماد | - تعتمد الفئة الفرعية بقوة على فئة الأب لأنها تستخدم خصائص وطرق الأب مباشرة. | - قد توجد الموضوعات ذات الصلة بشكل مستقل ؛ أنها لا تعتمد بقوة معا. |
| قدرة | - توسيع أو تخصيص طبقة الأب. - نمذجة العلاقة اللامركزية. | - إدارة الكائنات المرتبطة. - نمذجة العلاقات البدنية. |
النظر في المثال التالي:

إن نشر هذا الرسم البياني UML في Java هو كما يلي:
public class Person {
private String name ;
private int age ;
private Address address ; // Liên kết sử dụng lớp Address
public Person ( String name , int age , Address address ) {
this . name = name ;
this . age = age ;
this . address = address ;
}
// Getter và Setter cho các thuộc tính
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public int getAge () {
return age ;
}
public void setAge ( int age ) {
this . age = age ;
}
public Address getAddress () {
return address ;
}
public void setAddress ( Address address ) {
this . address = address ;
}
}
// Định nghĩa lớp Student kế thừa từ Person
public class Student extends Person {
public Student ( String name , int age , Address address ) {
super ( name , age , address );
}
}
// Định nghĩa lớp Teacher kế thừa từ Person
public class Teacher extends Person {
public Teacher ( String name , int age , Address address ) {
super ( name , age , address );
}
}
// Định nghĩa lớp Staff kế thừa từ Person
public class Staff extends Person {
public Staff ( String name , int age , Address address ) {
super ( name , age , address );
}
}
// Định nghĩa lớp Address
public class Address {
private String street ;
private String city ;
private String country ;
public Address ( String street , String city , String country ) {
this . street = street ;
this . city = city ;
this . country = country ;
}
// Getter và Setter cho các thuộc tính
public String getStreet () {
return street ;
}
public void setStreet ( String street ) {
this . street = street ;
}
public String getCity () {
return city ;
}
public void setCity ( String city ) {
this . city = city ;
}
public String getCountry () {
return country ;
}
public void setCountry ( String country ) {
this . country = country ;
}
}
// Định nghĩa lớp Department chứa Teacher và Course
public class Department {
private String name ;
private List < Teacher > teachers ; // Aggregation
private List < Course > courses ; // Composition
public Department ( String name ) {
this . name = name ;
this . teachers = new ArrayList <>();
this . courses = new ArrayList <>();
}
// Phương thức thêm giáo viên và khóa học
public void addTeacher ( Teacher teacher ) {
teachers . add ( teacher );
}
public void addCourse ( Course course ) {
courses . add ( course );
}
}
// Định nghĩa lớp Course
public class Course {
private String courseName ;
private List < Teacher > teachers ; // Association
public Course ( String courseName ) {
this . courseName = courseName ;
this . teachers = new ArrayList <>();
}
public void addTeacher ( Teacher teacher ) {
teachers . add ( teacher );
}
}
// Định nghĩa interface Maintainable
public interface Maintainable {
void maintain ();
}
// Định nghĩa lớp School
public class School implements Maintainable {
private String name ;
private List < Department > departments ; // Composition
public School ( String name ) {
this . name = name ;
this . departments = new ArrayList <>();
}
public void addDepartment ( Department department ) {
departments . add ( department );
}
// Triển khai phương thức từ interface Maintainable
@ Override
public void maintain () {
System . out . println ( "Maintaining the school facilities..." );
// Logic bảo trì cơ sở vật chất có thể được thực hiện ở đây
}
}