স্ট্যাটিক ক্লাস নেমস্পেস হিসাবে ব্যবহার করা


21

আমি অন্যান্য বিকাশকারীদের স্ট্যাটিক ক্লাস নেমস্পেস হিসাবে ব্যবহার করতে দেখেছি

public static class CategoryA
{
    public class Item1
    {
        public void DoSomething() { }
    }
    public class Item2
    {
        public void DoSomething() { }
    }
}

public static class CategoryB
{
    public class Item3
    {
        public void DoSomething() { }
    }
    public class Item4
    {
        public void DoSomething() { }
    }
}

অভ্যন্তরীণ ক্লাসগুলি ইনস্ট্যান্ট করতে, এটি নীচের মত দেখাবে

CategoryA.Item1 item = new CategoryA.Item1();

যুক্তিটি হ'ল "ব্যবহার করে" কীওয়ার্ড ব্যবহার করে নেমস্পেসগুলি গোপন করা যায়। তবে স্ট্যাটিক ক্লাস ব্যবহার করে বাইরের স্তর স্তর শ্রেণীর নাম নির্দিষ্ট করতে হবে, যা কার্যকরভাবে নামের স্থানগুলি সংরক্ষণ করে।

মাইক্রোসফট যে বিরুদ্ধে উপদেশ নির্দেশিকা । আমি ব্যক্তিগতভাবে মনে করি এটি পাঠযোগ্যতার উপর প্রভাব ফেলে। আপনার চিন্তা কি?


1
বাস্তবায়নের জন্য তাদের উপস্থিতি নামের জায়গাগুলি প্রয়োজন কিনা তা প্রয়োগকারীদের উপর নির্ভর করে। আপনি কেন তাদের উপর নেমস্পেসগুলি (এবং সেই সময়ে জাল নেমস্পেস) ব্যবহার করতে বাধ্য করবেন?
ক্রেইজ

গ্রুপিংয়ের উদ্দেশ্যে হতে পারে? যেমন প্রচুর সাব ক্লাস রয়েছে এবং সাব ক্লাসগুলিকে স্ট্যাটিক ক্লাসে গ্রুপিং করে। এটি নিবিড়তা পরিষ্কার করে?
ব্যবহারকারী 394128

সাব-ক্লাসগুলিকে সাব-নেমস্পেসে স্থাপন করা কি অভিপ্রায়টি পরিষ্কার করে দেবে না? এছাড়াও, এটি ডকুমেন্টেশন দ্বারা সমাধান হওয়া সমস্যার ধরণ।
ক্রেইজ

উত্তর:


16

স্ট্যাটিক ক্লাসকে নেমস্পেস হিসাবে ব্যবহার করা নেমস্পেস থাকার উদ্দেশ্যকে অস্বীকার করে।

মূল পার্থক্যটি এখানে:

আপনি যদি নেমস্পেস হিসাবে সংজ্ঞা দেন CategoryA, CategoryB<এবং যখন অ্যাপ্লিকেশন দুটি নেমস্পেস ব্যবহার করে:

CategoryA::Item1 item = new CategoryA::Item1(); 
CategoryB::Item1 item = new CategoryB::Item1();

এখানে CategoryAবা যদি নাম স্থানের CategoryBচেয়ে স্থিতিশীল শ্রেণীর হয় তবে অ্যাপ্লিকেশনটির ব্যবহার উপরে বর্ণিত হিসাবে প্রায় একই রকম।

তবে, আপনি যদি এটি একটি নেমস্পেস হিসাবে সংজ্ঞায়িত করেন এবং অ্যাপ্লিকেশনটি কেবলমাত্র 1 টি নেমস্পেস (অন্তর্ভুক্ত করে না CategoryB) ব্যবহার করে, সেক্ষেত্রে অ্যাপ্লিকেশনটি নিম্নলিখিতটি ব্যবহার করতে পারে

using namespace CategoryA; 
Item1 item = new Item1(); 

তবে আপনি যদি CategoryAএকটি স্থির শ্রেণি হিসাবে উপরোক্ত সংজ্ঞায়িত না হয়ে সংজ্ঞা দেন! একজন CategoryA.somethingপ্রতিবার লিখতে বাধ্য হয় ।

নামকরণের বিরোধগুলি এড়ানোর জন্য নেমস্পেসগুলি ব্যবহার করা উচিত যখন শ্রেণিবদ্ধকরণ সিস্টেমের মডেলের সাথে কিছুটা প্রাসঙ্গিকতা রাখে তখন শ্রেণি শ্রেণিবিন্যাস ব্যবহার করা উচিত।


এছাড়াও, যদি কেউ নেমস্পেস ব্যবহার করতে না পারে, এমনকি ক্লাসগুলিও ক্যান্স ব্যবহার করতে চায়: using Item1 = CategoryA.Item1(আমি মনে করি যে এটি নেস্টস্পেসগুলির জন্য যেমন নেস্টেড ক্লাসগুলির জন্য কাজ করে)
জর্জ ডেকেট

1
সি ++ এ, এডিএল শ্রেণির সুযোগ নিয়ে কাজ করে না; এটি নেমস্পেসের সুযোগ নিয়ে কাজ করে। তাই সি ++ নামস্থান না শুধুমাত্র প্রাকৃতিক পছন্দ, কিন্তু সঠিক এবং কথ্য পছন্দ এছাড়াও
নওয়াজ

আমি মনে করি কীওয়ার্ড ব্যবহার করে নেমস্পেসটি লুকানো এড়াতে ওপির উদ্দেশ্য। তিনি ব্যবহারকারীদের প্রতিবার এটি লিখতে বাধ্য করতে চান। হতে পারে তার নাম var s = new HideMe.MyPhoneNumberIs12345678.TheRealUsefulClass()
স্থানটি

5

এখানে যা চলছে তা অবশ্যই আইডেম্যাটিক সি # কোড নয়।

হতে পারে এই অন্যরা মডিউল প্যাটার্নটি বাস্তবায়নের চেষ্টা করছে - এটি আপনাকে ফাংশন, ক্রিয়া ইত্যাদির পাশাপাশি 'নেমস্পেস' (যেমন এই ক্ষেত্রে স্ট্যাটিক ক্লাস) এর ক্লাস করতে দেয়?


আমি একমত, অদ্ভুত দেখাচ্ছে।
মার্কো

4

প্রথমত, প্রতিটি শ্রেণি একটি নামস্থানে হওয়া উচিত, সুতরাং আপনার উদাহরণটি আরও বেশি এরকম হবে:

SomeNamespace.CategoryA.Item1 item = new SomeNamespace.CategoryA.Item1();

এটি বলেছিল, আমি এই জাতীয় কোড জিমন্যাস্টিকের কোনও লাভ দেখতে পাচ্ছি না যখন আপনি ঠিক যেমন এইরকম একটি নাম স্থানটি সংজ্ঞায়িত করতে পারেন:

namespace SomeNamespace.CategoryA { ... }

যদি আপনি সম্ভবত কোনও দিন উচ্চ শ্রেণির স্তরে কিছু স্থিতিশীল পদ্ধতি সংরক্ষণের কথা ভাবছেন, তবে এটি বোধগম্য হতে পারে তবে সি # নির্মাতারা মনে রাখে না এবং এটি অন্যের কাছে কেবল কম পাঠযোগ্যও হতে পারে - আমি অনেক সময় নষ্ট করব আপনি কেন এটি করেছেন তা ভাবছেন এবং আমি যদি এমন কোনও উত্স ফাইল মিস করছি যা ব্যাখ্যা সরবরাহ করবে।


তাহলে এনামদের নিয়মের ব্যতিক্রম কেন ?
sq33G

এটি একটি পৃথক প্রশ্ন :) তবে আমি এখনও এ্যামগুলিকে সংজ্ঞায়িত করার জন্য একটি স্থির শ্রেণীর সংজ্ঞা দিচ্ছি না।
zmilojko

1

জাভা, জাভাস্ক্রিপ্ট এবং .NET সম্পর্কিত নেমস্পেসগুলি সম্পূর্ণ নয়, এবং কেবল ক্লাস সঞ্চয় করার অনুমতি দেয়, তবে ধ্রুবক বা বৈশ্বিক পদ্ধতিগুলির মতো অন্যান্য স্টাফ দেয় না।

অনেক বিকাশকারী "স্ট্যাটিক ক্লাস" বা "স্ট্যাটিক পদ্ধতি" কৌশলগুলি ব্যবহার করেন, এমনকি কিছু লোক সুপারিশ না করে।


0

আমি জানি যে এটি একটি পুরানো প্রশ্ন, তবে একটি শ্রেণিটিকে নেমস্পেস হিসাবে ব্যবহার করার একটি খুব কার্যকর কারণ (যেটিতে একটি অ-স্থিতিশীল) হ'ল সি # প্যারামেট্রিক বা জেনেরিক নেমস্পেসগুলির সংজ্ঞা সমর্থন করে না। আমি এই বিষয়টিতে এখানে একটি ব্লগ পোস্ট লিখেছি : http://tyreejackson.com/generics-net-part5-generic-namespaces/

এর সংক্ষিপ্তসারটি হ'ল বয়লারপ্লেট কোডের বিশাল সোয়াথগুলি বিমূর্ত করার জন্য জেনেরিকগুলি ব্যবহার করার সময়, কখনও কখনও সম্পর্কিত শ্রেণি এবং ইন্টারফেসের মধ্যে একাধিক জেনেরিক পরামিতিগুলি ভাগ করা প্রয়োজন। এটি করার প্রচলিত উপায় হ'ল জেনেরিক পরামিতিগুলি, প্রতিবন্ধকতাগুলি এবং প্রতিটি ইন্টারফেসে এবং শ্রেণি স্বাক্ষরের সমস্তটিকে নতুন করে সংজ্ঞায়িত করা। সময়ের সাথে সাথে এটি প্যারামিটারগুলির প্রসার ঘটাতে পারে এবং এক ধরণের সম্পর্কিত পরামিতিগুলি সম্পর্কিত ধরণের আর্গুমেন্টগুলিকে এক ধরণের থেকে ফরোয়ার্ড করে সংশ্লিষ্ট ধরণের যোগ্যতা অর্জনের বিষয়ে নিয়মিত উল্লেখ না করার ক্ষেত্রে বাধা সৃষ্টি করে।

একটি বাহ্যিক জেনেরিক ক্লাস ব্যবহার করা এবং এর মধ্যে সম্পর্কিত ধরণের বাসা বাঁধাই নাটকীয়ভাবে কোডটি DRY আপ করতে পারে এবং এর বিমূর্তকরণকে সহজতর করতে পারে। এরপরে কেউ একটি কংক্রিট বাস্তবায়নের সাথে প্যারামেট্রিক নেমস্পেস ক্লাস অর্জন করতে পারে যা কংক্রিটের সমস্ত বিবরণ সরবরাহ করে।

এখানে একটি তুচ্ছ উদাহরণ:

public  class   Entity
                <
                    TEntity, 
                    TDataObject, 
                    TDataObjectList, 
                    TIBusiness, 
                    TIDataAccess, 
                    TIdKey
                >
        where   TEntity         : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>, subclassed
        where   TDataObject     : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.BaseDataObject, subclassed
        where   TDataObjectList : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.BaseDataObjectList, subclassed
        where   TIBusiness      : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.IBaseBusiness
        where   TIDataAccess    : Entity<TEntity, TDataObject, TDataObjectList, TIBusiness, TIDataAccess, TIdKey>.IBaseDataAccess
{

    public class    BaseDataObject
    {
        public TIdKey Id { get; set; }
    }

    public class BaseDataObjectList : Collection<TDataObject> {}

    public interface IBaseBusiness
    {

        TDataObject     LoadById(TIdKey id);
        TDataObjectList LoadAll();
        void            Save(TDataObject item);
        void            Save(TDataObjectList items);
        void            DeleteById(TIdKey id);
        bool            Validate(TDataObject item);
        bool            Validate(TDataObjectList items);

    }

    public interface IBaseDataAccess
    {

        TDataObject     LoadById(TIdKey id);
        TDataObjectList LoadAll();
        void            Save(TDataObject item);
        void            Save(TDataObjectList items);
        void            DeleteById(TIdKey id);

    }

}

এর মতো ব্যবহৃত:

public  class   User 
:
                Entity
                <
                    User, 
                    User.DataObject, 
                    User.DataObjectList, 
                    User.IBusiness, 
                    User.IDataAccess, 
                    Guid
                >
{
    public class DataObject : BaseDataObject
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class DataObjectList : BaseDataObjectList {}

    public interface IBusiness : IBaseBusiness
    {
        void DeactivateUserById(Guid id);
    }

    public interface IDataAcccess : IBaseDataAccess {}
}

এর মতো ডেরিভেটিভস গ্রহণ করুন:

public class EntityConsumer
{
    private User.IBusiness       userBusiness;
    private Permission.IBusiness permissionBusiness;

    public EntityConsumer(User.IBusiness userBusiness, Permission.IBusiness permissionBusiness) { /* assign dependencies */ }

    public void ConsumeEntities()
    {
        var users       = new User.DataObjectList();
        var permissions = this.permissionBusiness.LoadAll();

        users.Add
        (new User.DataObject()
        {
            // Assign property values
        });

        this.userBusiness.Save(users);

    }
}

এই ধরণের লেখার সুবিধাটি হ'ল প্রকারের সুরক্ষা এবং বিমূর্ত ক্লাসে প্রকারের কম কাস্টিং যুক্ত করা হয়। এটি বৃহত্তর স্কেলে ArrayListবনামের সমতুল্য List<T>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.