0Pricing
Java Academy · درس

اختيار استراتيجية التداخل المناسبة

قرّر بين أنواع الفئات المتداخلة استنادًا إلى الترابط واحتياجات الوصول وسهولة القراءة

اختيار استراتيجية التداخل المناسبة درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

اختيار استراتيجية التداخل المناسبة

توفر Java أربعة خيارات للتداخل: فئة من المستوى الأعلى، وفئة متداخلة ساكنة، وفئة داخلية (غير ساكنة)، وفئة محلية أو مجهولة. ويعتمد اختيار الخيار المناسب على الاقتران واحتياجات الوصول ونطاق إعادة الاستخدام.

شجرة القرار

اطرح الأسئلة التالية للاختيار:

  1. هل تُستخدم الفئة داخل الفئة الخارجية فقط؟ → فكّر في التداخل
  2. هل تحتاج إلى مثيل الفئة الخارجية؟ → فئة داخلية؛ وإلا → فئة متداخلة ساكنة
  3. هل تُستخدم داخل أسلوب واحد فقط؟ → فئة محلية أو مجهولة
  4. هل تطبّق أسلوبًا واحدًا؟ → Lambda

الفئة من المستوى الأعلى

استخدم فئة من المستوى الأعلى عندما يكون النوع واسع الاستخدام في قاعدة الشيفرة، أو يمثّل مفهومًا أساسيًا في المجال، أو سيُستورد من قِبل العديد من الفئات الأخرى.

// Top-level: used across many packages
public class Product {
    // ...
}

public interface Repository<T, ID> {
    Optional<T> findById(ID id);
    void save(T entity);
}

// These belong in separate .java files and are widely imported

الفئة المتداخلة الساكنة

استخدم الفئة المتداخلة الساكنة عندما تكون الفئة ذات معنى فقط في سياق الفئة الخارجية، ولا تحتاج إلى مثيل الفئة الخارجية، وينبغي أن تكون متاحة خارجيًا.

class Graph {
    // Edge only makes sense in the context of a Graph
    public static class Edge {
        public final int from, to, weight;
        public Edge(int from, int to, int weight) {
            this.from = from; this.to = to; this.weight = weight;
        }
    }

    private List<Edge> edges = new ArrayList<>();

    public void addEdge(int from, int to, int weight) {
        edges.add(new Edge(from, to, weight));
    }
}

الفئة الداخلية (غير الساكنة)

استخدم الفئة الداخلية عندما تكون للفئة صلة مفاهيمية قوية بمثيل الفئة الخارجية، وتحتاج إلى الوصول إلى أعضائها الخاصة — مثل المكرّرات أو الكائنات المساعدة وثيقة الاقتران.

class DataStore<T> {
    private final List<T> data;

    DataStore(List<T> data) { this.data = data; }

    // Must access data — inner class makes sense
    class Snapshot {
        private final List<T> copy;

        Snapshot() { this.copy = List.copyOf(data); } // accesses outer

        T get(int idx) { return copy.get(idx); }
        int size()     { return copy.size(); }
    }

    Snapshot snapshot() { return new Snapshot(); }
}

الفئة المحلية

استخدم الفئة المحلية عندما تكون الفئة مطلوبة داخل أسلوب واحد فقط، وتكون معقّدة بما يكفي لاحتواء عدة أساليب أو حالة، وتريد إبقاء نطاقها محدودًا.

static int countWords(String text, boolean caseSensitive) {
    class WordCounter {
        Map<String, Integer> counts = new HashMap<>();

        void count(String word) {
            String key = caseSensitive ? word : word.toLowerCase();
            counts.merge(key, 1, Integer::sum);
        }

        int uniqueCount() { return counts.size(); }
    }

    WordCounter wc = new WordCounter();
    for (String w : text.split("\\s+")) wc.count(w);
    return wc.uniqueCount();
}
System.out.println(countWords("the cat sat on the mat", false)); // 5

الفئة المجهولة مقابل Lambda

استخدم الفئة المجهولة عند الحاجة إلى عدة أساليب أو إلى تمديد فئة مجرّدة. واستخدم Lambda مع واجهات SAM.

// Lambda: clean for SAM
list.sort((a, b) -> a.compareTo(b));

// Anonymous: multi-method, or extending abstract class
java.util.TimerTask task = new java.util.TimerTask() {
    @Override public void run() { System.out.println("Tick!"); }
};
// TimerTask is abstract class — can't use lambda directly

جدول الملخص

مرجع سريع:

  • من المستوى الأعلى: إعادة استخدام واسعة، وأنواع API عامة
  • متداخلة ساكنة: تجميع منطقي، دون حاجة إلى مثيل الفئة الخارجية
  • داخلية: مرتبطة بقوة بمثيل الفئة الخارجية، وتحتاج إلى الوصول الخاص
  • محلية: محدودة بأسلوب، ومعقّدة بما يكفي لتكون فئة
  • مجهولة: تطبيق لمرة واحدة، قصير العمر
  • Lambda: واجهة SAM، دون حالة، ومختصرة

تطبيق عملي: تصميم HTTP Client

تطبيق استراتيجية التداخل على تصميم واقعي لـ HTTP Client.

class HttpClient {
    // Static nested: request config has no outer reference
    public static class RequestConfig {
        public final int timeoutMs;
        public final String userAgent;
        RequestConfig(int timeout, String ua) { this.timeoutMs = timeout; this.userAgent = ua; }
    }

    // Static nested: response is standalone data carrier
    public static class Response {
        public final int statusCode;
        public final String body;
        Response(int code, String body) { this.statusCode = code; this.body = body; }
    }

    private final RequestConfig config;
    HttpClient(RequestConfig config) { this.config = config; }

    public Response get(String url) {
        // Implementation using this.config
        return new Response(200, "body");
    }
}

تجنّب التداخل المفرط

تجنّب التداخل لأكثر من مستوى واحد. فالفئات المتداخلة بعمق يصعب التنقل بينها واختبارها. استخرجها إلى فئات من المستوى الأعلى أو فئات على مستوى الحزمة إذا ازداد تعقيدها.

البديل على مستوى الحزمة

بدلًا من التداخل، فكّر في جعل الفئة على مستوى الحزمة (دون محدد وصول). وستكون مرئية داخل الحزمة فقط، لكنها أسهل في الاختبار والصيانة من الفئة المتداخلة.

// In package com.example.order:

// Package-private: visible in package, no nesting
class OrderLine {  // no 'public' modifier
    final String sku;
    final int qty;
    OrderLine(String sku, int qty) { this.sku = sku; this.qty = qty; }
}

// Public class in same package can use OrderLine freely
public class Order {
    private List<OrderLine> lines = new ArrayList<>();
    // ...
}

السجلات والواجهات المختومة كبدائل

غالبًا ما تلغي ميزات Java الحديثة — مثل السجلات والواجهات المختومة — الحاجة إلى أنماط التداخل المعقّدة.

// Instead of nested inner class hierarchy:
sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
record Triangle(double b, double h) implements Shape {}

static double area(Shape s) {
    return switch (s) {
        case Circle c      -> Math.PI * c.r() * c.r();
        case Rectangle r   -> r.w() * r.h();
        case Triangle t    -> 0.5 * t.b() * t.h();
    };
}

تحقق سريع

متى تكون الفئة الداخلية (غير الساكنة) الخيار الأفضل مقارنةً بالفئة المتداخلة الساكنة؟

مراجعة: اختيار استراتيجية التداخل المناسبة

أهم النقاط:

  • من المستوى الأعلى: أنواع عامة تُستخدم على نطاق واسع في قاعدة الشيفرة
  • متداخلة ساكنة: مجمّعة منطقيًا مع الفئة الخارجية، دون حاجة إلى مثيل الفئة الخارجية
  • الفئة الداخلية: مرتبطة بقوة بمثيل الفئة الخارجية، وتصل إلى الأعضاء الخاصة
  • الفئة المحلية: محدودة بأسلوب، ومعقّدة بما يكفي لعدة أساليب
  • الفئة المجهولة: لمرة واحدة، وتجمع بين التصريح وإنشاء المثيل
  • Lambda: الخيار الأنظف لواجهات SAM؛ فكّر فيها عند استبدال الفئات المجهولة

الأسئلة الشائعة

هل درس «اختيار استراتيجية التداخل المناسبة» مجاني؟

نعم — نص درس «اختيار استراتيجية التداخل المناسبة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «اختيار استراتيجية التداخل المناسبة»؟

قرّر بين أنواع الفئات المتداخلة استنادًا إلى الترابط واحتياجات الوصول وسهولة القراءة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «اختيار استراتيجية التداخل المناسبة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الفئات المتداخلة الثابتة
  2. الفئات الداخلية والوصول إلى الفئة الخارجية
  3. الفئات المحلية والمجهولة
  4. اختيار استراتيجية التداخل المناسبة
← العودة إلى Java Academy