আমি কি সব স্থির পদ্ধতি ব্যবহার করতে পারি না?


64

নীচে দুটি আপডেটসুজেড পদ্ধতির মধ্যে পার্থক্য কী? আমি অনুভব করেছি যে আপনি যদি সত্ত্বাধিকারীর উপর কেবল চালনা করতে চান তবে স্থিতিশীল পদ্ধতি ব্যবহার করা আরও ভাল। কোন পরিস্থিতিতে আমার অ স্থির পদ্ধতি নিয়ে যাওয়া উচিত?

public class Subject
{
    public int Id {get; set;}
    public string Name { get; set; }

    public static bool UpdateSubject(Subject subject)
    {
        //Do something and return result
        return true;
    }
    public bool UpdateSubject()
    {
        //Do something on 'this' and return result
        return true;
    }
}

আমি জানি আমি সত্যিই বিরক্তিকর প্রশ্নের জন্য সম্প্রদায়ের কাছ থেকে অনেক লাথি পাব কিন্তু আমি নিজেকে জিজ্ঞাসা করতে থামাতে পারিনি।

উত্তরাধিকারের সাথে লেনদেন করার সময় এটি কি অবাস্তব হয়ে ওঠে?

আপডেট:
এটি এখন আমাদের কাজের জায়গায় ঘটছে। আমরা 5 জন বিকাশকারীকে নিয়ে 6 মাসের একটি এসপ নেট ওয়েব অ্যাপ্লিকেশন নিয়ে কাজ করছি। আমাদের স্থপতি সিদ্ধান্ত নিয়েছে যে আমরা সমস্ত API এর জন্য সমস্ত স্থিতিশীল পদ্ধতি ব্যবহার করি। তার যুক্তি স্থির পদ্ধতি হ'ল হালকা ওজন এবং এটি সার্ভার লোড রাখার মাধ্যমে ওয়েব অ্যাপ্লিকেশনগুলিতে উপকৃত হয়।


9
সমৃদ্ধ হিকি হ'ল অহঙ্কারী কিছুতে উত্সাহিত করবে (সমস্ত স্থিতিশীল পদ্ধতি)। আপনি যদি কার্যকরী শৈলী পছন্দ করেন তবে আপনি কার্যকরী ভাষাও ব্যবহার করতে পারেন;) সফ্টওয়্যারটির প্রতিটি জিনিসই কোনও বিষয় হিসাবে সর্বোত্তমভাবে মডেল করা হয় না।
চাকরি

13
@ জোব: আমি কীভাবে এটি কার্যকর তা দেখতে পাচ্ছি না - এটি পদ্ধতিগত proced
অ্যারোনআউট

2
@ জোব: এই শ্রেণিটি স্থায়ী নয়।
অ্যারোনআট

3
@ ডোনালফেলোস: অবশ্যই আপনি পারবেন, সি # এবং এফ # উভয়ই মিশ্র-দৃষ্টান্ত। তবে বাস্তবটি রয়ে গেছে, স্থির পদ্ধতি! = কার্যকরী প্রোগ্রামিং। এফপি মানেই পাসিং / চেইন ফাংশন, অপরিবর্তনীয় ডেটা প্রকার, পার্শ্ব-প্রতিক্রিয়া এড়ানো ইত্যাদি That's এটি ওপি-তে কোড স্নিপেট যা করে তার সম্পূর্ণ বিপরীতে।
অ্যারোনআউট

4
"তার যুক্তি স্থির পদ্ধতি হ'ল হালকা ওজন এবং এটি সার্ভার লোড রাখার মাধ্যমে ওয়েব অ্যাপ্লিকেশনগুলিতে উপকৃত হয়"। এটা ভুল। সার্ভারটি লোড রাখছেন?
ম্যাক্সএক্স

উত্তর:


87

আমি সুস্পষ্ট "এই" পরামিতিগুলির সাথে স্থির পদ্ধতির সর্বাধিক সুস্পষ্ট সমস্যাগুলি নিয়ে যাব:

  1. আপনি ভার্চুয়াল প্রেরণ এবং পরবর্তীকালে পলিমারফিজম হারাবেন। আপনি কখনই এই পদ্ধতিটি কোনও উত্পন্ন শ্রেণিতে ওভাররাইড করতে পারবেন না। অবশ্যই আপনি একটি উদ্ভূত শ্রেণিতে একটি new( static) পদ্ধতি ঘোষণা করতে পারেন , তবে যে কোনও কোড এটি অ্যাক্সেস করে তা পুরো শ্রেণীর শ্রেণিবিন্যাস সম্পর্কে সচেতন থাকতে হবে এবং সুস্পষ্ট চেকিং এবং কাস্টিং করা উচিত যা ওওকে এড়াতে হবে বলে ঠিক বোঝা যায় ।

  2. # 1 এর এক্সটেনশনের সাজান, আপনি কোনও ইন্টারফেসের মাধ্যমে শ্রেণীর উদাহরণগুলি প্রতিস্থাপন করতে পারবেন না , কারণ ইন্টারফেসগুলি (বেশিরভাগ ভাষায়) staticপদ্ধতিগুলি ঘোষণা করতে পারে না ।

  3. অপ্রয়োজনীয় শব্দভাণ্ডার। কোনটি আরও বেশি পঠনযোগ্য: Subject.Update(subject)নাকি ঠিক subject.Update()?

  4. যুক্তি যাচাই করা হচ্ছে। আবার ভাষার উপর নির্ভর করে, তবে অনেকে এই সুরক্ষার ত্রুটিটিকে অনিরাপদ রানটাইম শর্ত তৈরি করতে বাধা দিতে thisনা দেওয়ার জন্য একটি নিখুঁত চেকটি সংকলন করবেন null(বাফারের ধরণের বাছাই)। উদাহরণ পদ্ধতি ব্যবহার না করে, আপনাকে প্রতিটি পদ্ধতির শুরুতে এই চেকটি স্পষ্টভাবে যুক্ত করতে হবে।

  5. এটা বিভ্রান্তিকর. যখন কোনও সাধারণ, যুক্তিসঙ্গত প্রোগ্রামার কোনও staticপদ্ধতি দেখেন , তিনি স্বাভাবিকভাবেই ধরে নিতে চলেছেন যে এটির জন্য কোনও বৈধ উদাহরণের প্রয়োজন নেই (যদি না এটি তুলনা বা সমতা পদ্ধতির মতো একাধিক উদাহরণ গ্রহণ করে বা nullরেফারেন্সগুলিতে পরিচালনা করতে সক্ষম হয় তবে ) । স্থিতিশীল পদ্ধতিগুলি এইভাবে ব্যবহার করা দেখায় আমাদের দ্বিগুণ বা সম্ভবত ট্রিপল নেবে এবং চতুর্থ বা 5 তমবারের পরে আমরা চাপ ও ক্রুদ্ধ হয়ে যাব এবং yourশ্বর আপনাকে সহায়তা করবেন যদি আমরা আপনার বাড়ির ঠিকানা জানি।

  6. এটি সদৃশ একটি ফর্ম। আপনি যখন কোনও উদাহরণ পদ্ধতির আবেদন করেন তখন যা ঘটেছিল তা হ'ল সংকলক বা রানটাইম টাইপের পদ্ধতির টেবিলটিতে পদ্ধতিটি দেখায় এবং thisএকটি আর্গুমেন্ট হিসাবে ব্যবহার করে অনুরোধ করে । আপনি মূলত সংকলক ইতিমধ্যে যা করছে তা পুনরায় প্রয়োগ করছে are আপনি ডিআরওয়াই লঙ্ঘন করছেন , যখন প্রয়োজন নেই তখন একই প্যারামিটারটি বিভিন্ন পদ্ধতিতে বারবার পুনরাবৃত্তি করছেন ।

স্থির পদ্ধতির সাথে উদাহরণের পদ্ধতিগুলি প্রতিস্থাপনের কোনও ভাল কারণ ধারণা করা কঠিন । দয়া করে না।


5
আপনার চূড়ান্ত লাইনের জন্য +1 একা। আমি আশা করি আরও অনেক লোক "স্ট্যাটিক পদ্ধতি" ভাবার আগে "উদাহরণ পদ্ধতি" ভাবেন।
স্টুয়ার্ট লেল্যান্ড-কোল

4
+1 টি। আমি যুক্ত করব যে স্ট্যাটিক পদ্ধতিগুলি পরীক্ষাগুলি লেখা শক্ত করে-অসম্ভব করে তোলে, বেশিরভাগ ক্ষেত্রে আপনি এগুলি উপহাস করতে পারেন না: আপনার কোডের কোনও অংশ স্থিতিশীল পদ্ধতির উপর নির্ভর করে একবার আপনি এটিকে কোনও নম্বর দিয়ে স্থান দিতে পারবেন না- আপনার পরীক্ষা পরীক্ষা। .NET বিশ্বের একটি প্রধান উদাহরণ শ্রেণীর মত হবে File, FileInfoএবং DirectoryInfo(এবং আসলে লাইব্রেরি যা তাদের ইন্টারফেসগুলি যে তারপর হিসাবে প্রয়োজন এবং পরীক্ষায় আউট ব্যঙ্গ ইনজেকশনের করা যেতে পারে পিছনে লুকিয়ে আছে)।
এসএম

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

@ এসএম এটি কেবল সত্য নয়। যদি আপনার কোনও কিছুর উপর দৃ depend় নির্ভরশীলতা থাকে, স্থিতিশীল বা না হয়, এটি কোনও ইউনিট পরীক্ষায় থাকতে পারে না, তবে এটি অনিবার্য, পিরিয়ড। স্থির এই কারণে না। একটি স্ট্যাটিক পদ্ধতিতে ডিবি সংযোগের প্রতিনিধিত্ব করে এমন কোনও ক্লাস একইভাবে ইনজেকশনের ব্যবস্থা করা যেতে পারে। আপনি ধরে নিচ্ছেন যে "স্ট্যাটিক" এর অর্থ "স্থিতিশীল আরও শক্ত লুকানো নির্ভরতা বিশ্বব্যাপী রাষ্ট্র এবং বাহ্যিক সংস্থানগুলিকে স্পর্শ করা"। এইটা ঠিক না.
সারা

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

13

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


এফডব্লিউআইডাব্লু, সি এর সাহায্যে আপনি এই জাতীয় ভার্চুয়াল প্রেরণটি করতে পারেন: obj->type->mthd(obj, ...);এবং এটি অন্যান্য ভাষায় ভার্চুয়াল প্রেরণের সাথে যা ঘটেছিল তার সাথে যথেষ্ট মিল (তবে পর্দার আড়ালে)।
ডোনাল ফেলো

@ কার্ল আপনি আরও গভীর খনন শুরু করতে দয়া করে কিছু প্রকারের লিখিত রেফারেন্স সরবরাহ করতে পারেন?
জর্হে লভেন

আপনি জিওজেক্টকে একটি ভাল রেফারেন্স বাস্তবায়ন হিসাবে দেখতে চাইতে পারেন ।
কার্ল বিলেফেল্ড

10

স্থির পদ্ধতিতে সমস্যাটি এমন মুহুর্তে আসে যখন আপনার একটি সাব-ক্লাস প্রয়োজন।

স্থিতিশীল পদ্ধতিগুলিকে উপ-শ্রেণিতে ওভাররাইড করা যায় না, সুতরাং আপনার নতুন ক্লাসগুলি পদ্ধতির নতুন বাস্তবায়ন সরবরাহ করতে পারে না, এগুলি কম দরকারী করে তোলে।


2
এটি অগত্যা কোনও সমস্যা নয়। কিছু ভাষা ইচ্ছাকৃতভাবে একই জিনিসটি সম্পাদন করার জন্য অন্যান্য পদ্ধতি (সি ++ এবং সি # তে অ-ভার্চুয়াল পদ্ধতিগুলি) সরবরাহ করে - সি # এমনকি এই ধারণাটি আরও বাড়ানোর জন্য "সিলড" পদ্ধতি সরবরাহ করে! স্পষ্টতই, আপনি কেবল এটির
হেকের

@ স্টিভ, এটি প্রতিস্থাপন করছে না, আপনি এখনও উভয় পদ্ধতি সরাসরি কল করতে পারেন।

@ স্টিভ, জাভা স্থিত পদ্ধতিতে ওভাররাইড করা যাবে না।

@ থরবজর্ন - প্রথমত, প্রশ্নটি জাভা বা অন্য কোনও নির্দিষ্ট ওওপি ভাষা ট্যাগ করা হয়নি। আরও গুরুত্বপূর্ণ বিষয়, আমি বলিনি যে আপনি কোনও স্থির সদস্য ফাংশন ওভাররাইড করতে পারেন। আমি একটি বিষয় বলার জন্য একটি উপমা ব্যবহার করার চেষ্টা করছিলাম। আমি স্পষ্টভাবে ব্যর্থ হিসাবে, মন্তব্য মুছে ফেলা।
স্টিভ 314

2
এক অর্থে, এগুলি এখনও "পদ্ধতির নতুন বাস্তবায়ন"। শুধু ওওপি অর্থে নয়। এটি কিছুটা অনুভূত হ'ল আমি বলছি "আপনার
শব্দটিও

7

আপনি যদি কোনও পদ্ধতি ঘোষণা করেন static, আপনাকে পদ্ধতিটি চালনার জন্য শ্রেণি থেকে কোনও newশব্দ ( কীওয়ার্ড ব্যবহার করে ) ইনস্ট্যান্ট করতে হবে না । তবে আপনি যে কোনও সদস্যের ভেরিয়েবলগুলি স্থির না হলে আপনি উল্লেখ করতে পারবেন না , সেই ক্ষেত্রে সেই সদস্য ভেরিয়েবলগুলি শ্রেণীর অন্তর্গত, শ্রেণীর নির্দিষ্ট তাত্ক্ষণিক বস্তু নয়।

অন্যভাবে বলুন, staticকীওয়ার্ডটি একটি ঘোষণাকে শ্রেণীর সংজ্ঞার অংশ হিসাবে ডেকে আনে, সুতরাং এটি শ্রেণীর সমস্ত উদাহরণগুলিতে (শ্রেণি থেকে তাত্ক্ষণিকৃত বস্তু) একক রেফারেন্স পয়েন্ট হয়ে যায় ।

এরপরে এটি অনুসরণ করা হয়েছে যে আপনি যদি নিজের শ্রেণীর একাধিক চলমান অনুলিপি চান এবং আপনি চান না যে রাজ্যটি (সদস্য ভেরিয়েবলগুলি) আপনার চলমান সমস্ত অনুলিপিগুলির মধ্যে ভাগ করা হোক (যেমন প্রতিটি বস্তুর নিজস্ব অনন্য রাষ্ট্র রয়েছে) তবে আপনি এই সদস্য ভেরিয়েবল স্থির ঘোষণা করতে পারে না।

সাধারণভাবে, আপনি staticকেবল তখনই ক্লাস এবং পদ্ধতিগুলি ব্যবহার করতে পারেন যখন আপনি ইউটিলিটি পদ্ধতিগুলি তৈরি করছেন যা এক বা একাধিক পরামিতি গ্রহণ করে এবং কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই কোনও ধরণের বস্তু ফেরত দেয় (অর্থাত্ শ্রেণিতে রাষ্ট্রের পরিবর্তনশীলগুলিতে পরিবর্তন)


1
আমি ওপিকে পাতলা করে তার staticমানে বুঝতে পেরেছি , তিনি কেন সব কিছুকে স্থির হিসাবে ঘোষণা করবেন না তা জিজ্ঞাসা করছেন।
এড এস

1
তিনি হয় একটি দৃষ্টান্ত কথা প্রসঙ্গে Subjectঅন্তর্নিহিত পরিবর্তে কিন্তু একটি সুনির্দিষ্ট প্যারামিটার হিসাবে, - thisপ্যারামিটার।
স্টিভ 314

হ্যাঁ, তবে ... তবে আমি মনে করি আপনার বক্তব্যটি আমি দেখতে পাচ্ছি না।
এড এস

@ এড - কেবলমাত্র আপনি একটি সুস্পষ্ট প্যারামিটারের মাধ্যমে যা কিছু অন্তর্নিহিত thisপ্যারামিটারের মাধ্যমে করতে পেরেছিলেন তা করতে পেরেছেন । প্রত্যাশার মধ্যে পার্থক্য রয়েছে, কিন্তু উত্তরাধিকারের বাইরে, আপনি যা করতে পারেন তার মধ্যে কোনও আসল পার্থক্য নেই । উদাহরণস্বরূপ, এই অ-স্থিতিশীল সদস্যদের এক্সেস করা যেতে পারে - সুস্পষ্ট প্যারামিটারের মাধ্যমে।
স্টিভ 314

আমি এই ধারণার অধীনে কাজ করেছিলাম যে আপনি একই # ক্লাসে ঘোষিত একটি স্থির পদ্ধতি (যেমন আপনি সি ++ তে পারেন) এর মাধ্যমে সি # তে যুক্তির ব্যক্তিগত সদস্যদের কাছে পাবেন না। আমি কেন ভেবেছিলাম তা নিশ্চিত নয় তবে আমি ভুল ছিলাম।
এড এস

3

লোকেরা যে যুক্তি দেয় যে 'স্থিতিশীল পদ্ধতিগুলি খারাপ ডিজাইন দেখায়' অগত্যা পদ্ধতিগুলির কারণে নয়, এটি আসলে স্থির ডেটা, অন্তর্নিহিত বা স্পষ্ট। অন্তর্নিহিত বলতে আমি প্রোগ্রামটিতে যে কোনও রাজ্য বলতে বোঝায় যা রিটার্ন মান (গুলি) বা পরামিতিগুলিতে নেই। স্ট্যাটিক ফাংশনে স্থিতি পরিবর্তন করা পদ্ধতিগত প্রোগ্রামিংয়ের ক্ষেত্রে একটি ছোঁড়া। তবে যদি ফাংশনটি রাষ্ট্রের সংশোধন না করে, বা উপাদান উপাদান ফাংশনে রাষ্ট্র পরিবর্তনকে প্রতিনিধিত্ব করে, তবে এটি কার্যক্ষমতার চেয়ে কার্যকরী দৃষ্টান্তের চেয়ে বেশি।

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

চূড়ান্তভাবে সাধারণত 'স্টেটম্যানেজার' এবং স্থির বা বৈশ্বিক ডেটা হিসাবে দেখা বড় আকারের বস্তুগুলির মধ্যে অনুশীলনের কোনও পার্থক্য নেই। স্থির পদ্ধতির সঠিকভাবে ব্যবহারের সুবিধা হ'ল তারা পরবর্তীকালে পুনর্বিবেচনাকারীদের কাছে রাষ্ট্রকে পরিবর্তন না করার লেখকের অভিপ্রায় নির্দেশ করতে পারে।


1
আপনার বক্তব্য "... প্রক্রিয়াজাতীয় প্রোগ্রামিংয়ের জন্য একটি প্রত্যাবর্তন ..." আমাকে ভাবতে বাধ্য করে যে আপনি এটিকে খুব খারাপ বিবেচনা করছেন, আমি অনুমান করি এটি একটি অর্থে এটি ওওর অংশ।
NoChance

making ... unit testing much easier.না এটা হবে না। এটি এটিকে এমন কোনও কোড তৈরি করে যা স্থিতিশীল পদ্ধতিগুলিকে ইউনিট পরীক্ষার পক্ষে অসম্ভব বলে , যেহেতু আপনি এটি স্ট্যাটিক পদ্ধতি থেকে আলাদা করতে পারবেন না। স্ট্যাটিক পদ্ধতিতে কল সেই শ্রেণীর জন্য একটি হার্ডকোডযুক্ত নির্ভরতা হয়ে যায়।
StuperUser

2

ভাষা এবং আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে উত্তরটি হতে পারে যে খুব বেশি পার্থক্য নেই, তবে staticসংস্করণটিতে কিছুটা বিশৃঙ্খলা রয়েছে।

আপনার উদাহরণ সিনট্যাক্সটি জাভা বা সি # এর পরামর্শ দেয় বলে আমার ধারণা থোরবজর্ন রাভন অ্যান্ডারসন (দেরিতে বাইন্ডিং সহ) সমস্যাটি ওভাররাইডিংটি সঠিকভাবে দেখায়। একটি স্থিতিশীল পদ্ধতিতে, দেরীতে বাইন্ডিংয়ের উপর ভিত্তি করে বেঁধে দেওয়ার জন্য কোনও "বিশেষ" পরামিতি নেই, সুতরাং আপনার দেরীতে বাইন্ডিং থাকতে পারে না।

বাস্তবে, একটি স্ট্যাটিক পদ্ধতিটি মডিউলটিতে কেবল একটি ফাংশন, সেই মডিউলটি শ্রেণীর সমান নাম - এটি আসলে কোনও ওওপি পদ্ধতি নয়।


2

আপনি যখন এটি করেন তখন আপনি মূলত অবজেক্টগুলির পুরো পয়েন্টকে পরাস্ত করেন। প্রসেসরিয়াল কোড থেকে অবজেক্ট অরিয়েন্টেড কোডে অনেকটা স্থানান্তরিত হওয়ার একটি ভাল কারণ রয়েছে।

ক্লাসের ধরণটিকে প্যারামিটার হিসাবে গ্রহণ করার মতো স্থির পদ্ধতি আমি কখনই ঘোষণা করব না । এটি কেবল কোনও লাভের জন্য কোডটিকে আরও জটিল করে তোলে।


3
আপনি যদি objectকোনও staticপদ্ধতিতে পাস করছিলেন এবং কোনও নতুন ফিরিয়ে দিচ্ছেন তবে আপনি এটি করতে পারেন object। কার্যকরী প্রোগ্রামাররা এটি সারাক্ষণ করে।
রবার্ট হার্ভে

প্রশ্ন: আপনি Mathস্থির শ্রেণিকে "কোনও লাভের জন্য জটিল" হিসাবে বিবেচনা করেন না, বা আপনি যদি পছন্দ করেন তবে সমস্ত সংখ্যার ধরণের প্রকৃত মান, অবহেলা, যোগ, স্কোয়ারিং, নির্বিচারে শিকড় ইত্যাদির সংজ্ঞা দেওয়া ভার্চুয়াল পদ্ধতি থাকলে? আমি তাই মনে করি না. যখন আপনাকে কিছু আক্রমণকারী প্রয়োগ করার দরকার হয় তখন লুকানো মিউটেবল স্টেটটি সংরক্ষণ করতে হলে অবজেক্টগুলি ঝরঝরে থাকে। টাইপ নিজেই টাইপের মধ্যে চালিত প্রতিটি স্বচ্ছ পদ্ধতিতে একসাথে ম্যাশ করা, এটি এমন একটি বিষয় যা জটিল এবং অনিবার্য কোডের দিকে নিয়ে যায়। আমি রবার্টের সাথে একমত, আপনি হয়ত দেখতে চান যে কার্যনির্বাহী প্রোগ্রামাররা কীভাবে কাজ করে, এটি সত্যিকারের চোখের ওপেনার হতে পারে!
সারা

@ কাই যেমন আমি বলেছি, বেশ। ম্যাথ ক্লাসটি যুক্তিসঙ্গত ব্যতিক্রম, যদিও এটি সংখ্যার সাথে সংযুক্ত করা কোনও খারাপ ধারণা হবে না।
লরেন পেচটেল

2

এখানে প্রচুর দুর্দান্ত উত্তর রয়েছে, এবং উত্তর হিসাবে আমি যেটা সামনে আসতে পারি তার চেয়ে এগুলি অনেক বেশি অন্তর্দৃষ্টিপূর্ণ এবং জ্ঞানবুদ্ধিযুক্ত, তবে আমি অনুভব করি যে কিছুটা এড্রেস করা হচ্ছে না:

"আমাদের স্থপতি স্থির করে দিয়েছিলেন যে আমরা সমস্ত এপিআইয়ের জন্য সমস্ত স্থিতিশীল পদ্ধতি ব্যবহার করি His তাঁর যুক্তি স্থির পদ্ধতি হ'ল ওজন এবং এটি সার্ভারকে লোড রাখার মাধ্যমে ওয়েব অ্যাপ্লিকেশনগুলিতে উপকৃত হয় ।"

(সাহসী জোর আমার হয়)

প্রশ্নের এই অংশটি সম্পর্কে আমার 2 সিটি হ'ল:

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

এটিতে শয়তানের অ্যাডভোকেটকে খেলুন: আমরা আরও এগিয়ে যেতে পারি এবং স্টাফ যেমন বলতে পারি:

  • যদি (দৃষ্টান্ত) পদ্ধতির প্রতিটি অনুরোধের জন্য কোনও উদাহরণ তৈরি করা হয় (কেবল এটি স্থির রেখে দেওয়া এবং এটির মতো কল করার বিপরীতে) এটি সত্যিই খারাপ হয়ে উঠতে পারে

  • কনস্ট্রাক্টরের জটিলতা, টাইপ হাইয়ারালকি, অন্যান্য উদাহরণ সদস্য এবং অন্যান্য অজানা কারণগুলির উপর নির্ভর করে অ স্থিত পদ্ধতি কলের অতিরিক্ত ওভারহেড পরিবর্তিত হতে পারে এবং সত্যই বড় হতে পারে

সত্য বলতে গেলে, আইএমএইচও, উপরোক্ত বিষয়গুলি (এবং "আসুন স্ট্যাটিক্সগুলি দ্রুত কারণ তারা ব্যবহার করি" এর সাধারণ পদ্ধতির নাম) স্ট্র ম্যান আর্গুমেন্ট / মূল্যায়ন:

  • কোডটি যদি ভাল হয় এবং এই তর্কটির সাথে আরও সুনির্দিষ্ট হয়, যদি প্রয়োজন অনুসারে উদাহরণগুলি তৈরি করা হয় (এবং একটি অনুকূল ফ্যাশনে ধ্বংস করা হয়), তবে উপযুক্ত হওয়ার সময় আপনি ইনসান পদ্ধতি ব্যবহার করে কোনও অতিরিক্ত ওভারহেড পাবেন না (কারণ আপনি যদি কেবলমাত্র প্রয়োজনীয় বস্তুগুলি তৈরি করুন, সেগুলি তৈরি করা হত এমনকি যদি সেই পদ্ধতিটি স্থির হিসাবে ঘোষণা করা হয় যেখানে অন্য কোনও জায়গায় = একই তাত্পর্যপূর্ণ ওভারহেড)

  • স্থিতিশীল পদ্ধতি ঘোষণাকে এভাবে অপব্যবহারের মাধ্যমে উদাহরণগুলি কীভাবে তৈরি হয় সে সম্পর্কে আপনার কোডের সাথে কিছু সমস্যা আড়াল করা সম্ভব (যেহেতু পদ্ধতিটি স্থির একটি ভুল ইনস্ট্যান্সেশন কোডটি পরে অবহেলা করা যেতে পারে এবং এটি কখনও ভাল নয়)।


2

এটি একটি খুব আকর্ষণীয় প্রশ্ন যা আপনার কাছে জিজ্ঞাসা করা সম্প্রদায়ের উপর নির্ভর করে খুব আলাদা উত্তর পেতে থাকে। অন্যান্য উত্তরগুলি সি # বা জাভা পক্ষপাত বলে মনে হচ্ছে: একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ (বেশিরভাগ) খাঁটি অবজেক্ট ভিত্তিক এবং অবজেক্ট অরিয়েন্টেশন কী তা সম্পর্কে এক ধরণের মুর্খ দৃষ্টিভঙ্গি রয়েছে।

অন্যান্য সম্প্রদায়গুলিতে, যেমন সি ++, অবজেক্ট অরিয়েন্টেশনকে আরও উদারতার সাথে ব্যাখ্যা করা হয়। কিছু বিশেষজ্ঞ জানেন যে বিশেষজ্ঞরা বিষয়টি অধ্যয়ন করেছেন এবং প্রকৃতপক্ষে এই সিদ্ধান্তে পৌঁছেছেন যে ফ্রি ফাংশনগুলি এনক্যাপসুলেশন উন্নত করে (জোর দেওয়া আমার):

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

স্কট মায়ার্স

সি ++ পরিভাষার সাথে অপরিচিত যারা:

  • সদস্য ফাংশন = পদ্ধতি
  • অ-সদস্য ফাংশন = স্থির পদ্ধতি
  • অ-বন্ধু = কেবল সর্বজনীন এপিআই ব্যবহার করুন
  • অ-সদস্য নন-বন্ধু ফাংশন = স্থির পদ্ধতি যা কেবল সর্বজনীন এপিআই ব্যবহার করে

এখন, আপনার প্রশ্নের উত্তর দিতে:

আমি কি সব স্থির পদ্ধতি ব্যবহার করতে পারি না?

না, আপনার সবসময় স্থির পদ্ধতি ব্যবহার করা উচিত নয়।

আপনি যখনই কেবল কোনও শ্রেণীর পাবলিক এপিআই ব্যবহার করতে পারেন তবে এগুলি আপনার ব্যবহার করা উচিত ।


-3

জাভাতে ...

স্ট্যাটিক পদ্ধতিগুলি ওভাররাইট করা হয় না তবে পরিবর্তে লুকানো থাকে এবং সুতরাং শ্রেণিটি বাড়ানোর ক্ষেত্রে এটি একটি বড় পার্থক্য (সমস্যা?) হবে।

অন্যদিকে আমি লক্ষ্য করেছি যে জাভা প্রগ্রেমারগুলির সমস্ত বিষয় হ'ল ভাবার প্রবণতা রয়েছে, কেন এটি সত্য তা বুঝতে না পেরে এবং আমি একমত নই।

শ্রেণীর নির্দিষ্ট কোডের জন্য স্ট্যাটিক ব্যবহার করা উচিত। স্থিতিশীল উত্তরাধিকার নিয়ে ভাল কাজ করে না।

স্থির পদ্ধতি ব্যবহারের কয়েকটি ভাল উদাহরণগুলি কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই স্বতন্ত্র ফাংশন।

কীওয়ার্ডটি সিঙ্ক্রোনাইজডও দেখুন ...


2
এই স্থিতিশীল পদ্ধতিটি কীভাবে লুকিয়ে রয়েছে এবং শ্রেণি প্রসারিত করার সময় এই পার্থক্য এবং সমস্যাটি কোথায় উপস্থিত হবে? এর সাথে কীভাবে সিঙ্ক্রোনাইজ করা যায়? স্থিতিশীল এবং উত্তরাধিকারের সমস্যাগুলি কোথায় পাওয়া যায়? মূল জাভা লাইব্রেরিতে আপনি কিছু স্থিতিশীল পদ্ধতিগুলির ভাল এবং খারাপ সরবরাহ করতে পারেন এবং ব্যাখ্যা করতে পারেন যে প্রতিটি ক্ষেত্রে কেন?
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.