سؤال

لدي سؤال حول أفضل طريقة تعريض غير متزامنة عن بعد واجهة.

الشروط هي كما يلي:

  • البروتوكول هو غير متزامن
  • طرف ثالث يمكن تعديل البيانات في أي وقت
  • الأمر ذهابا وإيابا يمكن أن تكون كبيرة
  • نموذج يجب أن تكون مناسبة تماما واجهة المستخدم التفاعل
  • بروتوكول يدعم الاستفسارات على بعض الأشياء, وهكذا يجب على نموذج

كوسيلة لتحسين بلدي تفتقر إلى المهارات في هذا المجال (و فرشاة بلدي جافا بشكل عام), أنا قد بدأت المشروع لخلق الكسوف-استنادا إلى الواجهة الأمامية xmms2 (موضح أدناه).

إذن السؤال هو ؛ كيف يجب أن يعرض عن بعد واجهة أنيق نموذج البيانات (في هذه الحالة ، وتتبع الإدارة و التعامل مع الحدث)?

أرحب بأي شيء من المناقشات العامة إلى نمط اسم إسقاط أو أمثلة ملموسة بقع :)


هدفي الأساسي هنا هو تعلم عن هذه الفئة من مشاكل في العامة.إذا كان المشروع يمكن أن تستفيد من ذلك, حسنا, ولكن أقدم بدقة أن يكون شيئا لبدء مناقشة حول.

لقد تنفيذ بروتوكول التجريد الذي أسميه 'العميل' (لأسباب الإرث) الذي يسمح لي للوصول إلى الأكثر تعرضا الميزات باستخدام استدعاءات الأسلوب الذي أنا سعيد حتى لو كان بعيدا عن الكمال.

الميزات التي تقدمها xmms2 شيطان أشياء مثل مسار البحث ، الفوقية استرجاع البيانات والتلاعب تغيير تشغيل الدولة ، تحميل قوائم التشغيل وهلم جرا وهكذا دواليك.

أنا في منتصف التحديث إلى أحدث إصدار مستقر من xmms2 و ظننت أنني قد كذلك إصلاح بعض صارخ الضعف الحالي التنفيذ.

بلدي خطة لبناء أفضل التجريد على الجزء العلوي من واجهة بروتوكول يسمح المزيد من التفاعل الطبيعي مع الشيطان.الحالي 'نموذج' التنفيذ صعب الاستخدام و هو بصراحة قبيحة جدا (ناهيك عن واجهة المستخدم رمز الذي هو سيء حقا في أجهزة الصراف الآلي).

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

أي البيانات التي يمكن تعديلها من قبل طرف ثالث في أي وقت و هذا يجب أن يكون بشكل صحيح ينعكس في نموذج التغيير-توزيع الإخطارات

هذه الواجهات المعرضة عند الاتصال, من خلال العودة كائن الهرمي الذي يبدو مثل هذا:

  • اتصال
    • تشغيل getPlayback()
      • Play, pause, القفز, المسار الحالي وما إلى ذلك
      • فضح تشغيل التغييرات الدولة
    • المسارات getTracks()
      • المسار getTrack(id) الخ
      • فضح تتبع التحديثات
    • مجموعات getCollection()
      • تحميل والتلاعب قوائم التشغيل أو يدعى مجموعات
      • الاستعلام مكتبة الوسائط
      • تعرض مجموعة التحديثات
هل كانت مفيدة؟

المحلول

على غير متزامن قليلا ، أود أن أقترح التدقيق في java.util.concurrent, و خصوصا Future<T> واجهة.مستقبل واجهة المستخدم لتمثيل الأشياء التي ليست جاهزة بعد ، ولكن يتم إنشاؤها في موضوع مستقل.أنت تقول أن الأجسام يمكن تعديلها في أي وقت من قبل طرف ثالث ولكن لا زلت أقترح عليك استخدام غير قابل للتغيير عودة الكائنات هنا وبدلا من أن يكون موضوع مستقل/سجل الأحداث يمكنك الاشتراك للحصول على لاحظت عندما صلاحية الكائنات.لدي القليل من البرمجة مع معهد اليونسكو للإحصاء ، ولكن أعتقد أن استخدام العقود الآجلة الاتصالات غير المتزامنة سيكون لديك استجابة واجهة المستخدم الرسومية بدلا من تلك التي كانت في انتظار الخادم الرد.

من أجل الاستفسارات أود أن أقترح استخدام طريقة تسلسل لبناء كائن الاستعلام و كل كائن إرجاعها بواسطة الأسلوب تسلسل يجب أن يكون Iterable.على غرار كيف Djangos النموذج.نقول لديك QuerySet الذي ينفذ Iterable<Song>.ثم يمكنك استدعاء allSongs() التي من شأنها إرجاع نتيجة بالتكرار على جميع الأغاني.أو allSongs().artist("Beatles"), و سيكون لديك iterable على كل Betles الأغاني.أو حتى allSongs().artist("Beatles").years(1965,1967) وهلم جرا.

آمل أن يساعد هذا على أنها مكان الانطلاق.

نصائح أخرى

Iterable فقط طريقة التكرار الحصول على() أو somesuch.لذلك لا حاجة لبناء أي استفسار أو تنفيذ أي قانون حتى تبدأ فعلا بالتكرار.أنها لا تجعل تنفيذ في المثال الخاص بك زائدة عن الحاجة.ومع ذلك فإن الموضوع سوف يكون مؤمنا حتى النتيجة الأولى هي المتاحة ، لذلك قد تفكر في استخدام منفذ لتشغيل رمز الاستعلام في موضوع مستقل.

@Staale

فمن المؤكد أنها ربما, ولكن كما لاحظ ، التي من شأنها أن تجعل حجب (في المنزل عن شيء مثل 10 ثوان بسبب النوم الأقراص) ، وهذا يعني أنني لا يمكن استخدامه لتحديث واجهة المستخدم مباشرة.

يمكنني استخدام التكرار إلى إنشاء نسخة من نتيجة في موضوع مستقل ومن ثم ترسل إلى واجهة المستخدم ، ولكن حين مكرر الحل في حد ذاته بل هي أنيقة, انها لن تناسب بشكل جيد للغاية.في النهاية شيئا تنفيذ IStructuredContentProvider يحتاج إلى عودة مجموعة من كافة الكائنات من أجل عرضه في TableViewer, حتى إذا كنت يمكن أن تحصل بعيدا مع الحصول على شيء مثل هذا من رد...:)

أنا سوف تعطيه المزيد من التفكير.ربما تكون قادرا على عمل شيء.أنها لا تعطي رمز نظرة لطيفة.

@Staale:شكرا جزيلا!

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

أنا حاليا حل مشكلة مماثلة باستخدام عامل موضوع حظر انتظار إرسال واردة الأمر الردود, ولكن هذا النهج لا يترجم بشكل جيد جدا.

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

somehandlername(int changes, Track old_track, Track new_track)

أو ما شابه ذلك, ولكن بعد ذلك كنت قد ينتهي مع عدة إصدارات من نفس المسار.

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

ربما شيء مثل

Tracks.allSongs().artist("Beatles").years(1965,1967).execute()

العودة في المستقبل قد تعمل...

استنتاجاتي حتى الآن ؛

أنا ممزقة على ما إذا كان استخدام حاصل على تتبع الأجسام أو تعرض فقط الأعضاء منذ كائن غير قابل للتغيير.

class Track {
    public final String album;
    public final String artist;
    public final String title;
    public final String genre;
    public final String comment;

    public final String cover_id;

    public final long duration;
    public final long bitrate;
    public final long samplerate;
    public final long id;
    public final Date date;

    /* Some more stuff here */
}

أي شخص يريد معرفة عندما يكون هناك شيء حدث المسار في المكتبة بتنفيذ هذا...

interface TrackUpdateListener {
    void trackUpdate(Track oldTrack, Track newTrack);
}

هذا هو كيف querys يتم بناؤها.سلسلة الدعوات لقلوبكم المحتوى.هيئة المحلفين ما زالت خارج على الحصول على() على الرغم من.هناك بعض التفاصيل في عداد المفقودين ، مثل كيف ينبغي التعامل مع البدل وأكثر استعلامات متقدمة مع disjunctions.ربما أنا فقط بحاجة الى بعض الانتهاء رد وظائف, ربما مماثلة غير متزامن الإنجاز المميز, ولكن سنرى بشأن ذلك.ربما هذا سوف يحدث في طبقة إضافية.

interface TrackQuery extends Iterable<Track> {
    TrackQuery years(int from, int to);
    TrackQuery artist(String name);
    TrackQuery album(String name);
    TrackQuery id(long id);
    TrackQuery ids(long id[]);

    Future<Track[]> get();
}

بعض الأمثلة:

tracks.allTracks();
tracks.allTracks().artist("Front 242").album("Tyranny (For You)");

المسارات واجهة هو في الغالب مجرد الغراء بين الاتصال و المسارات الفردية.أنها سوف تكون واحدة تنفيذ أو إدارة البيانات الفوقية التخزين المؤقت ، إن وجدت (كما هو الحال اليوم ، ولكن أعتقد أنني سوف إزالته خلال إعادة بيع ديون و أرى إن كنت فعلا في حاجة إليها).كما يوفر هذا medialib تتبع التحديثات كما انه سيكون الكثير من العمل على تنفيذ ذلك من خلال المسار.

interface Tracks {
    TrackQuery allTracks();

    void addUpdateListener(TrackUpdateListener listener);
    void removeUpdateListener(TrackUpdateListener listener);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top