مسیرها
/
Java
Java
/
تمرین‌ها
/
لاگ‌ها، لاگ‌ها، لاگ‌ها!
لاگ‌ها، لاگ‌ها، لاگ‌ها!

لاگ‌ها، لاگ‌ها، لاگ‌ها!

تمرین یادگیری

مقدمه

نوع شمارشی

یک نوع شمارشی یک نوع داده‌ی ویژه است که اجازه می‌دهد یک متغیر مجموعه‌ای از ثابت‌های از پیش تعریف‌شده باشد. متغیر باید با یکی از مقادیری که برایش از پیش تعریف شده‌اند برابر باشد. نمونه‌های رایج شامل جهت‌های قطب‌نما (مقادیر NORTH، SOUTH، EAST و WEST) و روزهای هفته است.

چون ثابت هستند، اسم فیلدهای یک نوع شمارشی با حروف بزرگ نوشته می‌شود.

تعریف یک نوع شمارشی

در زبان برنامه‌نویسی Java، یک نوع شمارشی را با استفاده از کلیدواژه‌ی enum تعریف می‌کنید. برای مثال، یک نوع شمارشی روزهای هفته را این‌گونه تعریف می‌کنید:

public enum DayOfWeek {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
}

هر زمان که بخواهید مجموعه‌ی مشخصی از ثابت‌ها را نمایش دهید، باید از نوع شمارشی استفاده کنید. این شامل انواع شمارشی طبیعی مانند سیاره‌های منظومه‌ی شمسی و مجموعه‌داده‌هایی است که همه‌ی مقادیر ممکنشان را در زمان کامپایل می‌دانید؛ برای مثال گزینه‌های یک منو، پرچم‌های خط فرمان و غیره.

استفاده از یک نوع شمارشی

این کد نشان می‌دهد چطور از نوع شمارشی DayOfWeek که بالا تعریف شد استفاده کنید:

public class Shop {
    public String getOpeningHours(DayOfWeek dayOfWeek) {
        switch (dayOfWeek) {
            case MONDAY:
            case TUESDAY:
            case WEDNESDAY:
            case THURSDAY:
            case FRIDAY:
                return "9am - 5pm";
            case SATURDAY:
                return "10am - 4pm"
            case SUNDAY:
                return "Closed.";
        }
    }
}
var shop = new Shop();
shop.getOpeningHours(DayOfWeek.WEDNESDAY);
// => "9am - 5pm"

افزودن متد و فیلد

انواع شمارشی زبان برنامه‌نویسی Java بسیار قدرتمندتر از همتایانشان در زبان‌های دیگر هستند. اعلان enum یک کلاس را تعریف می‌کند (که نوع شمارشی نامیده می‌شود). بدنه‌ی کلاس شمارشی می‌تواند شامل متدها و فیلدهای دیگر باشد:

public enum Rating {
    GREAT(5),
    GOOD(4),
    OK(3),
    BAD(2),
    TERRIBLE(1);

    private final int numberOfStars;

    Rating(int numberOfStars) {
        this.numberOfStars = numberOfStars;
    }

    public int getNumberOfStars() {
        return this.numberOfStars;
    }
}

فراخوانی متد getNumberOfStars روی یکی از اعضای نوع شمارشی Rating:

Rating.GOOD.getNumberOfStars();
// => 4

دستورالعمل‌ها

در این تمرین، خطوط لاگ را پردازش می‌کنید.

هر خط لاگ رشته‌ای است با این قالب: "[<LVL>]: <MESSAGE>".

سطوح لاگ مختلف عبارت‌اند از:

  • TRC (ردیابی)
  • DBG (debug)
  • INF (اطلاعات)
  • WRN (هشدار)
  • ERR (خطا)
  • FTL (بحرانی)

سه وظیفه دارید.

1. تجزیه‌ی سطح لاگ

یک enum به اسم LogLevel تعریف کنید که شش عنصر متناظر با سطوح لاگ بالا دارد.

  • TRACE
  • DEBUG
  • INFO
  • WARNING
  • ERROR
  • FATAL

سپس متد LogLine.getLogLevel() را پیاده‌سازی کنید که سطح لاگ تجزیه‌شده‌ی یک خط لاگ را برمی‌گرداند:

var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO

2. پشتیبانی از سطح لاگ ناشناخته

متأسفانه گاهی بعضی خطوط لاگ یک سطح لاگ ناشناخته دارند. برای اینکه با این خطوط لاگ به‌شکل مناسبی رفتار کنید، یک عنصر UNKNOWN به enum LogLevel اضافه کنید که هنگام تجزیه‌ی یک سطح لاگ ناشناخته باید برگردانده شود:

var logLine = new LogLine("[XYZ]: Overly specific, out of context message");
logLine.getLogLevel();
// => LogLevel.UNKNOWN

3. تبدیل خط لاگ به قالب کوتاه

سطح لاگ یک خط لاگ خیلی طولانی است. برای کاهش فضای دیسک لازم برای ذخیره‌ی خطوط لاگ، قالب کوتاهی طراحی شده است: "[<ENCODED_LEVEL>]:<MESSAGE>".

سطح لاگ رمزگذاری‌شده نگاشت ساده‌ای از یک سطح لاگ به یک عدد است:

  • UNKNOWN - 0
  • TRACE - 1
  • DEBUG - 2
  • INFO - 4
  • WARNING - 5
  • ERROR - 6
  • FATAL - 42

متد LogLine.getOutputForShortLog() را پیاده‌سازی کنید که می‌تواند قالب کوتاه‌شده‌ی خط لاگ را خروجی بدهد:

var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Java Exercism

آماده‌اید لاگ‌ها، لاگ‌ها، لاگ‌ها! را شروع کنید؟

در Exercism ثبت‌نام کنید تا Java را همراه با 26 مفهوم158 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.