کلاس‌ساز 🎼


امیرحسین که فردی است جوان و جویای نام‌! به‌دنبال پیاده‌سازی سیستمی است که دنیا را تکان دهد. او فکری در سر دارد که احساس می‌کند اولین قدم از رسیدن به یک سیستم هوشمند قوی است.

او قصد دارد کلاس‌هایی را در زبان جاوا، فقط با داشتن اطلاعات کلی از آن کلاس‌ها و به‌صورت پویا ایجاد کند. امیرحسین که اولین گام‌های این پروژه را نوشته، در تکمیل آن از شما کمک خواسته است.

جزئیات پروژه🔗

پروژه‌ی اولیه را از این لینک دانلود کنید. ساختار فایل‌های پروژه اولیه به‌صورت زیر است:

.
├── ClassDetail
├── ClassTypes
├── ClassUtil
├── Method
└── OopType
Plain text

وظیفه اصلی شما در این سوال، تکمیل کلاس ClassUtil است. در این کلاس متدی با نام classMaker وجود دارد که پارامتر ورودی از نوع ClassDetail دریافت می‌کند و باید کلاسی با اطلاعاتی که از این پارامتر دریافت می‌کند، بسازد. در ادامه به بررسی کلاس ClassDetail میپردازیم:

کلاس ClassDetail🔗

این کلاس دارای ۵ پراپرتی زیر است:

  1. پراپرتی type: این پراپرتی که از نوع OopType است مشخص کننده نوع کلاسی است که باید ساخته شود. این نوع می‌تواند enum، interface یا classباشد.
  2. پراپرتی name: این پراپرتی که از نوع رشته است نام کلاس را مشخص می‌کند.
  3. پراپرتی properties: این پراپرتی که از نوع Map است نوع و نام پراپرتی‌های کلاس را مشخص می‌کند، در این مپ کلید‌ها نوع و مقادیر نام پراپرتی‌ها است.
  4. پراپرتی methods: این پراپرتی لیستی از کلاس Method است. کلاس Method نیز دارای سه پراپرتی returnType، name و parameters است که به‌ترتیب نام، نوع مقدار بازگشت و پارامتر‌های ورودی متد را مشخص می‌کند.
  5. پراپرتی oop: این پراپرتی لیستی از رشته‌ها را مشخص می‌کند. این رشته‌ها نام کلاس‌های جاواست که شما باید براساس نوع این کلاس‌ها، آن‌ها را extends یا implementsکنید.

کلاس ClassUtil🔗

حال که با کلاس ClassDetail آشنا شدید باید کلاس ClassUtil را تکمیل کنید. در ادامه به بررسی دو مثال از عملکرد این کلاس خواهیم پرداخت.

فرض کنید قصد داریم تا یک enum با نام Month بسازیم که پراپرتی با نام NAME دارد. برای این کار کد زیر را می‌نویسیم و از متد کلاسی که تکمیل کردید استفاده می‌کنیم:

extensionFromNameMain.java
OopType type = OopType.ENUM;
String name = "Month";
Map<String, String> properties = Map.of("", "NAME");
String code = ClassUtil.classMaker(new ClassDetail(type, name, properties, List.of(), List.of()));
Java

خروجی این کد باید کلاسی به‌صورت زیر باشد:

extensionFromNameMonth.java
public enum Month {
 NAME;
}
Java

در مثالی دیگر فرض کنید قصد داریم تا کلاسی بسازیم که دارای مقادیری به‌صورت زیر باشد:

extensionFromNameMain.java
OopType type = OopType.CLASS;
String name = "Month";
Map<String, String> properties = Map.of("String", "name");
List<String> oop = List.of("Object");
String code = ClassUtil.classMaker(new ClassDetail(type, name, properties, List.of(), oop));
Java

که در این حالت متغیر code باید به‌صورت زیر باشد:

extensionFromNameMonth.java
import java.lang.Object;
import java.lang.String;
public class Month extends Object {
String name;
}
Java

نکات🔗

  • کلاس شما حتما باید بدون مشکل کامپایل شود.
  • تضمین می‌شود نام کلاس‌هایی که در پراپرتی oop قرار داده می‌شود، حتما وجود دارند و از پکیج‌های استاندارد جاوا هستند.
  • کلاسی که می‌سازید نباید هیچ کلاس اضافی را import کرده باشد.
  • رعایت تمام موارد شی‌گرایی، به‌عنوان مثال هر کلاس فقط می‌تواند یک کلاس را extends و ... ، باید در کلاس شما رعایت شده باشد.
  • در صورت وجود مشکل در قسمت extends یا implements ، کلاس شما باید کامل ساخته شود و فقط extends یا implements را نادیده بگیرد.
  • اگر کلاسی متد داشت، بدنه متد‌ها باید خالی باشد و تضمین می‌شود نوع خروجی متد‌ها void باشد.

آن‌چه باید آپلود کنید🔗

پس از پیاده‌سازی موارد خواسته‌شده، کلاس ClassUtil را زیپ کرده و ارسال کنید.