يجب أن تكون فئات مساعد / المرافق العامة المجردة؟

StackOverflow https://stackoverflow.com/questions/309553

  •  08-07-2019
  •  | 
  •  

سؤال

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

وماذا سيكون إيجابيات وسلبيات يكون لإعلان مثل هذه الفئة كما مجردة.

public [abstract] class Utilities{

   public static String getSomeData(){
       return "someData";
   }

   public static void doSomethingToObject(Object arg0){
   }
}
هل كانت مفيدة؟

المحلول

هل يمكن أن مجرد الإعلان عن منشئ الخاص الذي لا يفعل شيئا.

والمشكلة مع إعلان الطبقة "مجردة" هي أن الكلمة مجردة تعني عادة ما يقصد تلك الفئة ليكون subclassed وتوسيع نطاقها. وهذا بالتأكيد ليس ما تريد هنا.

نصائح أخرى

ولا تهتم جعلها مجردة، وإنما تشمل منشئ parameterless الخاص لمنعهم من إنشاء مثيل من أي وقت مضى.

ونقطة المقارنة للمهتمين: في C # كنت ستعلن الفئة لتكون ثابتة، مما يجعلها مجردة <م> و مختومة في شكل جمعت (نهائي جافا)، ودون أي منشئ المثال على الإطلاق. هذا أيضا يجعل من خطأ وقت ترجمة لإعلان معلمة، متغير، وما إلى ذلك مجموعة من هذا النوع. مفيد.

وأنا لا تعلن المرافق طبقات مجردة، وأعلن لهم نهائيا وجعل القطاع الخاص المنشئ. وبهذه الطريقة لا يمكن أن يكون subclassed وأنها لا يمكن إنشاء مثيل.



public final class Utility
{
    private Utility(){}

    public static void doSomethingUseful()
    {
        ...
    }
}

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

وأود أن أضيف المزيد من خطوة أبعد منشئ الخاص:

public class Foo {
   // non-instantiable class
   private Foo() { throw new AssertionError(); }
}

ورمي AssertionError يمنع الأساليب في نفس الفئة من instantiating فئة (وأيضا، فإنها يمكن أن محاولة). هذه ليست عادة مشكلة ولكن في بيئة فريق لا يمكن ان تعرف ما شخص ما سوف نفعل.

وفيما يتعلق "مجردة" الكلمة، وقد لاحظت المرافق الطبقات subclassed في العديد من الحالات:

public class CoreUtils { ... }
public class WebUtils extends CoreUtils { ... }

public class Foo { ... WebUtils.someMethodInCoreUtils() ... }

وأعتقد أن يتم ذلك لدرجة أن الناس لا يجب أن تذكر أي فئة الأداة المساعدة لتشمل. هل هناك أي سلبيات لهذا؟ هل هذا نموذج مضاد؟

والتحيات، LES

وكما ذكر آخرون، وجعل منشئ المعلمة أقل الخاص. لا أحد يمكن أن تخلق مثيل لها، بصرف النظر عن الفئة نفسها.

وكما أظهرت الآخرين كيف يتم ذلك مع لغات أخرى، ويأتي هنا كيف يمكنك أن تفعل ذلك في C ++ المقبل نسخة، وكيفية جعل فئة غير instantiable:

struct Utility { 
    static void doSomething() { /* ... */ } 
    Utility() = delete; 
};

لا، ولكن إذا لغتك تؤيد ذلك، هناك حجة قوية لبذل أنه في معظم الحالات ينبغي (يمكن) أن أعلن باسم 'ثابت' ... ثابت يقول المترجم أنه لا يمكن إنشاء مثيل، وأن جميع يجب أن تكون أساليب في نفوسهم ثابت.

والخلاصة هي لفئات التي لديها تفاصيل التنفيذ القائمة على سبيل المثال، والتي سيتم استخدامها بواسطة مثيلات الفئات المشتقة ...

وشخص ذكر أنه في C # 3.0 هل يمكن تحقيق ذلك عن طريق وسائل التمديد. أنا لست C # الرجل، فعلت بعض مرة أخرى في 1.5 / 2.0 أيام، ولكن لم تكن قد استخدمت منذ ذلك الحين. استنادا إلى فهم سريع للغاية وأعتقد أن شيئا من هذا القبيل يمكن أن يتحقق في جافا مع واردات ثابتة. وأنا أدرك وليس في كل نفس الشيء، ولكن إذا كان الهدف هو جعل مجرد هذه الأساليب فائدة تبدو أكثر قليلا "الوطنية" (لعدم وجود مصطلح أفضل) إلى فئة الدعوة، وأعتقد أنه سوف تفعل خدعة. وإذا افترضنا أن الطبقة المرافق I أعلن في سؤالي الأصلي.

import static Utilities.getSomeData;

public class Consumer {

    public void doSomething(){

        String data =  getSomeData();
    }

}

وقد أقدم بعض النصائح البناءة؟

إذا كنت تفعل الكثير من هذا، هناك نوعان من المشاكل التي ستواجه.

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

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

وشيء آخر، إذا كان لديك فئة فائدة مع مجموعة من أساليب ثابتة المتعلقة شبه والمتغيرات ثابتة، وتريد دائما أن يكون المفرد. لقد وجدت هذا خارج عن طريق التجربة والخطأ، ولكن عند معرفة تحتاج إلى أكثر من 1 (النهاية سوف أنت)، انه من الاسهل بكثير لجعل المفرد إلى multipleton (؟) ثم محاولة تغيير فئة ثابتة في multipleton ( حسنا، لذلك أنا جعل الكلمات حتى الآن).

وحظا سعيدا. وهذه الأشياء في الغالب التجربة والخطأ بالنسبة لي - حظيت بها مثل 5 سنوات على الرغم من قبل، ولقد وجدت أبدا مثيل حيث I يأسف لعدم وجود ثابت الدرجة / أساليب

.

وأساليب مساعد / المرافق العامة تسير على ما يرام. لا تقلق بشأن إضافتها إلى مكتبة داخل التطبيق الخاص بك أو الإطار. معظم الأطر التي رأيتها استخدامها في العديد من الأصناف.

وأن يقال، إذا كنت ترغب في الحصول ماكرة حقا عنها يجب أن ننظر إلى <لأ href = "http://weblogs.asp.net/dwahlin/archive/2008/01/25/c-3-0 -ميزات-تمديد methods.aspx "يختلط =" نوفولو noreferrer "> طرق الإرشاد في C # 3.0. وذلك باستخدام طريقة تمديد جعل المرافق الخاصة بك أكثر قليلا من جزء "شمولي" من إطار الخاصة بك والتي تبدو كما لو أنها ما نحاول القيام به من خلال النظر لجعلها مجردة. ناهيك عن طريقة تمديد الكثير من المرح للكتابة!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top