ব্যক্তিগত স্ট্যাটিক পদ্ধতি ব্যবহারে সুবিধা ant


209

অভ্যন্তরীণ ব্যক্তিগত পদ্ধতি রয়েছে এমন কোনও শ্রেণি তৈরি করার সময়, সাধারণত কোড নকলকে হ্রাস করতে, যে কোনও উদাহরণ ক্ষেত্র ব্যবহারের প্রয়োজন হয় না, পদ্ধতিটিকে স্থির হিসাবে ঘোষণার জন্য কর্মক্ষমতা বা মেমরির সুবিধা রয়েছে?

উদাহরণ:

foreach (XmlElement element in xmlDoc.DocumentElement.SelectNodes("sample"))
{
    string first = GetInnerXml(element, ".//first");
    string second = GetInnerXml(element, ".//second");
    string third = GetInnerXml(element, ".//third");
}

...

private static string GetInnerXml(XmlElement element, string nodeName)
{
    return GetInnerXml(element, nodeName, null);
}

private static string GetInnerXml(XmlElement element, string nodeName, string defaultValue)
{
    XmlNode node = element.SelectSingleNode(nodeName);
    return node == null ? defaultValue : node.InnerXml;
}

GetInnerXML () পদ্ধতিগুলি স্থির হিসাবে ঘোষণার কোনও সুবিধা আছে কি? কোন মতামত প্রতিক্রিয়া দয়া করে, আমার একটি মতামত আছে।


উত্তর:


221

থেকে FxCop নিয়ম পৃষ্ঠা এই করুন:

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


37
আমি আরও যোগ করব যে "স্ট্যাটিক" ধারাটি ক্ষতি করে না এবং ইতিমধ্যে 1 শব্দ সহ কিছু "ডকুমেন্টেশন" সরবরাহ করে। এটি আপনাকে বলে যে এই পদ্ধতিটি কোনও উদাহরণ সদস্যকে ব্যবহার করছে না এবং আপনি প্রায়শই
নিখরচায়

20
আমি যতদূর বলছিলাম: "কোনও পদ্ধতির যদি রাষ্ট্রীয় অ্যাক্সেসের প্রয়োজন না হয় তবে এটি একটি স্ট্যাটিক করুন" সাধারণ নিয়ম হিসাবে।
ড্যানম্যান

3
ভারসাম্যের স্বার্থে, এটি উল্লেখ করা মূল্যবান যে প্রচুর লোক সাধারণত স্থির পদ্ধতির বিরুদ্ধে থাকে কারণ তারা পলিমারফিজমটি ভেঙে দেয়, এবং এর অর্থ এটি পরীক্ষার জন্য কোনও বিষয়কে স্ট্যাব করা যায় না। উদাহরণস্বরূপ googletesting.blogspot.co.uk/2008/12/… দেখুন
অ্যান্ডি

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

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

93

যখন আমি একটি ক্লাস লিখছি, বেশিরভাগ পদ্ধতি দুটি বিভাগে পড়ে:

  • যে পদ্ধতিগুলি ব্যবহার করে / বর্তমান উদাহরণের স্থিতি পরিবর্তন করে।
  • সহায়ক পদ্ধতিগুলি যা বর্তমান অবজেক্টের স্থিতি ব্যবহার / পরিবর্তন করে না তবে আমার অন্য কোথাও প্রয়োজনীয় মানগুলি গণনা করতে সহায়তা করে।

স্থিতিশীল পদ্ধতিগুলি দরকারী, কারণ কেবলমাত্র তার স্বাক্ষরটি দেখে আপনি জানেন যে এটির কলিংটি বর্তমান দৃষ্টান্তের অবস্থার ব্যবহার বা সংশোধন করে না।

এই উদাহরণটি ধরুন:

পাবলিক ক্লাস লাইব্রেরি
{
    ব্যক্তিগত স্ট্যাটিক বইয়ের সন্ধান বই (তালিকা <বুক> বই, স্ট্রিং শিরোনাম)
    {
        // কোড এখানে যায়
    }
}

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

আমি কোনও পদ্ধতি বা ফাংশনের স্বাক্ষর দিয়ে যতটা সম্ভব যোগাযোগ করার চেষ্টা করি এবং এটি করার এটি একটি দুর্দান্ত উপায়।


1
সি ++ এ ধরণের কনস্ট-মেথড ঘোষণার কথা, তাই না?
আনহপ্পে

হ্যাঁ - ভুল কী হতে পারে তা সীমাবদ্ধ করে জিনিসগুলিকে সরল করার জন্য ভাষাটি ব্যবহারের এটি আরও একটি ভাল উপায়।
নীল

এটি অগত্যা সত্য নয়। এর অনুমান করা একটি করা যাক যে Libraryএকটি দৃষ্টান্ত ক্ষেত্র রয়েছে List<Book> _booksএটা বই সঞ্চয় করতে (যদিও আপনি কিভাবে একটি নকশা চাই Libraryসম্ভবত কিন্তু W / E শ্রেণী), এবং এটি এই তালিকা পাসের findBook, এবং যে স্ট্যাটিক পদ্ধতি কল books.Clear()বা books.Reverse()ইত্যাদি। আপনি যদি কোনও পরিবর্তনীয় স্থিতির কোনও রেফারেন্সে কোনও স্থিতিশীল পদ্ধতি অ্যাক্সেস দেন, তবে সেই স্থির পদ্ধতিটি আপনার রাজ্যটিকে খুব ভালভাবে বিশৃঙ্খলা করতে পারে।
সার

1
সত্য। এবং সেই ক্ষেত্রে, স্বাক্ষরটি আমাদের দেখায় যে এই পদ্ধতির লাইব্রেরির একটি উদাহরণে (এবং রূপান্তর করার ক্ষমতা) অ্যাক্সেস ছিল।
নিল

কার্যত যে কোনও প্রতিরক্ষামূলক নির্মাণের জন্য আমরা ব্যবহার করতে পারি, এটি ক্ষুন্ন করার কিছু উপায় রয়েছে। তবে এগুলি ব্যবহার করা এখনও বুদ্ধিমান এবং "সাফল্যের গর্তের" দিকে আমাদের সঠিক দিকে ঠেলে দিতে সহায়তা করে।
নিল

81

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

এসসিআর: এমএসডিএন - http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.110).aspx


15

হ্যাঁ, সংকলককে পদ্ধতিগুলিতে অন্তর্নিহিত thisপয়েন্টারটি পাস করার দরকার নেই static। এমনকি আপনি যদি এটি আপনার উদাহরণ পদ্ধতিতে ব্যবহার না করেন তবে এটি এখনও পাস হচ্ছে।


এটি রানটাইমে কোনও পারফরম্যান্স বা মেমরির সুবিধার সাথে কীভাবে সম্পর্কিত?
স্কট ডরম্যান

11
একটি অতিরিক্ত প্যারামিটার পাস করার অর্থ সিপিইউকে একটি রেজিস্টারে প্যারামিটার স্থাপনের জন্য অতিরিক্ত কাজ করতে হবে, এবং যদি উদাহরণ পদ্ধতিটি অন্য পদ্ধতিতে কল করে তবে স্ট্যাকের উপরে চাপ দিন।
কেন্ট বুগার্ট

5

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

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


4

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


কেবল কারণ এটি একটি শ্রেণিবদ্ধ স্কোরযুক্ত ভেরিয়েবলের অর্থ এটি স্থির হওয়া উচিত নয়।
স্কট ডরম্যান

3
না, কিন্তু যদি এটি একটি স্ট্যাটিক পদ্ধতি দ্বারা ব্যবহৃত হচ্ছে তাহলে এটি হবে স্থিত হওয়া। যদি পদ্ধতিটি স্থির না হয় তবে আপনি ক্লাসের সদস্যকে স্থির করতে পারেন নি, এবং এর ফলে ক্লাসের প্রতিটি উদাহরণের জন্য আরও মেমরি ব্যবহৃত হবে।
জোয়েল কোহোর্ন

2

আমি সমস্ত বেসরকারী পদ্ধতিগুলি স্থিতিশীল হতে পছন্দ করি যতক্ষণ না তারা সত্যই না হতে পারে। আমি নিম্নলিখিতটি বেশি পছন্দ করি:

public class MyClass
{
    private readonly MyDependency _dependency;

    public MyClass(MyDependency dependency)
    {
        _dependency = dependency;
    }

    public int CalculateHardStuff()
    {
        var intermediate = StepOne(_dependency);
        return StepTwo(intermediate);
    }

    private static int StepOne(MyDependency dependency)
    {
        return dependency.GetFirst3Primes().Sum();
    }

    private static int StepTwo(int intermediate)
    {
        return (intermediate + 5)/4;
    }
}

public class MyDependency
{
    public IEnumerable<int> GetFirst3Primes()
    {
        yield return 2;
        yield return 3;
        yield return 5;
    }
}

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

যখন MyClassআরও নির্ভরতা পায় কারণ আমাদের লগিং প্রয়োজন এবং একটি ওয়েব পরিষেবাটিও অবহিত করা প্রয়োজন (দয়া করে ক্লিচের উদাহরণগুলি ক্ষমা করুন) তবে কোন পদ্ধতিগুলির মধ্যে কোন নির্ভরতা রয়েছে তা সহজেই সহজে দেখা যায় এটি কার্যকর helpful

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


-3

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


4
এটি কোনও অর্থবোধ করে না। গাদা কখনো কোড জন্য মেমরি সঞ্চয় করে কোন পদ্ধতি, স্ট্যাটিক বা অন্যথায়। গাদা বস্তুর দৃষ্টান্তের জন্য। কোনও পদ্ধতির যেকোন আবেদনের জন্য স্ট্যাকের ডেটা থাকবে (প্যারামিটারগুলির জন্য মেমরি ধরে রাখা, প্রত্যাবর্তনের মান, উত্তোলনকৃত স্থানীয়, ইত্যাদি) তবে পদ্ধতিটি সম্পাদন শেষ করার পরে সেগুলি সমস্ত চলে যায়।
Servy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.