স্থির পদ্ধতিগুলির মাধ্যমে অবজেক্টগুলি কেন সুবিধাজনক হবে?


9

স্থিতিশীল পদ্ধতি ব্যবহার এবং কোনও বস্তুর উপর পদ্ধতিটি কল করার চেয়ে কোনও বস্তুর রেফারেন্সটিকে প্যারামিটার হিসাবে পাস করার কেন সুবিধা হবে?

আমি কী বলতে চাইছি তা স্পষ্ট করতে নীচের শ্রেণিটি বিবেচনা করুন:

public class SomeClass {
    private double someValue;

    public SomeClass() {
        // Some constructor in which someValue is set
    }

    public void incrementValue() {
        someValue++;
    }
}

স্থিতিশীল পদ্ধতির সাথে এই বিকল্প বাস্তবায়নের তুলনায়:

public class SomeClass {
    private double someValue;

    public SomeClass() {
        // Some constructor in which someValue is set
    }

    public static void incrementValue(SomeClass obj) {
        obj.someValue++;
    }
}

আমার প্রশ্নটি কেবল এই শ্রেণীর মধ্যে সীমাবদ্ধ নয়; কোনও বিন্দু যেখানে আপনি কোনও পদ্ধতিতে কল করার পরিবর্তে কোনও বস্তুটি পাস করতে চান তাতেই আমি আগ্রহী this এটি কি কখনও সুবিধাজনক? যদি তাই হয় তবে কেন?


1
এটি ঠিক একই জিনিসটি করার দুটি পদ্ধতি সহ একটি গন্ধের মতো মনে হয়। স্থিতিশীল পদ্ধতিটি যদি কেবল অন্য পদ্ধতিতে প্রেরণ করা হয় তবে এটি অকেজো মনে হবে তবে প্রয়োজনীয়ভাবে "খারাপ" নয়
নাথান মেরিল

13
@ নাথানমারিল আমার মনে হয় আপনি পয়েন্টটি মিস করছেন। তিনি জিজ্ঞাসা করছেন যে যদি এমন কোনও পরিস্থিতি হয় যেখানে প্রথম পদ্ধতির পরিবর্তে দ্বিতীয় পদ্ধতি তৈরি করা এবং ব্যবহার করা ভাল।

@ মেগো উদাহরণে দেওয়া পদ্ধতিগুলিই নয়; আমি জিজ্ঞাসা করছি স্ট্যাটিক পদ্ধতি ব্যবহার করার সময় এবং মুহূর্তগুলিতে পাস করার জন্য কোনও মুহুর্ত রয়েছে কি না ?
অ্যাডিসন ক্র্যাম্প

সম্ভবত আপনি জাভা জন্য বিশেষভাবে জিজ্ঞাসা করছেন?
এন্ডারল্যান্ড

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

উত্তর:


34

একটি তুচ্ছ উদাহরণ: যখন পাস করা উদাহরণটি বৈধভাবে বাতিল হয়ে যেতে পারে এবং আপনি এটিকে (অ-তুচ্ছ) পরিচালনা পদ্ধতিতে অন্তর্ভুক্ত করতে চান।


1
উদাহরণ: স্ট্রিং। সি # তে তুলনা করুন (আমি মনে করি জাভাতেও তেমন কিছু রয়েছে)
edc65

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

20

আপনার উদাহরণে, উদাহরণ পদ্ধতিটি একটি পরিষ্কার বিজয়ী।

সাধারণ ক্ষেত্রে, আমি কয়েকটি কারণ সম্পর্কে ভাবতে পারি যেখানে স্থির পদ্ধতি যথাযথ হতে পারে:

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

  • আপনি দুটি বা ততোধিক বস্তু পাস করছেন এবং জোর দিতে চান যে এগুলি সমান গুরুত্বের।

  • null একটি বৈধ মান (যেমন ব্যবহারকারী 9000 দ্বারা ব্যাখ্যা করা হয়েছে)।


5

স্থির পদ্ধতির পরিবর্তে পদক্ষেপগুলিকে উদাহরণ পদ্ধতি হিসাবে পরিবর্তিত করে এমন পদ্ধতিগুলি অন্তর্ভুক্ত করা বুদ্ধিমানের কাজ হবে ।

তবে আমরা স্থির পদ্ধতির উদাহরণ খুঁজে পেতে পারি যা pureপদ্ধতি এবং অবজেক্টটিকে ইনপুট হিসাবে গ্রহণ করতে পারে, যেমন আমাদের নির্দিষ্ট বৈধতার বিধিগুলির উপর ভিত্তি করে যখন বস্তুটি ইনস্ট্যান্ট করতে হবে। উদাহরণস্বরূপ, .NET এর কাছে DateTime.TryParse(String s, DateTime d)অবজেক্টটি বৈধকরণ এবং ইনস্ট্যান্ট করার পদ্ধতি রয়েছে । তবে প্যারামিটারটি DateTime dস্পষ্টভাবে হিসাবে চিহ্নিত করা হয়েছে out

যখন আমরা বস্তুর তুলনা এবং ফেরত মান বদলে একটি বুলিয়ান / তুলনা ফলাফলের পূর্ণসংখ্যা মান উদাহরণস্বরূপ, পছন্দসই হিসাবে বস্তুর পেতে চান আরেকটি মামলা, হতে পারে Team.GetHigherScorer(teamA, teamB).IncreaseRanking()। এটি এর চেয়ে পরিষ্কার হবে:

int compareResult = teamA.compareScoreWith(teamB);
if (compareResult == 1)
    teamA.IncreaseRanking();
else if (compareResult == -1) 
    teamB.IncreaseRanking();

(কেসটিকে সরলতার জন্য "আঁকতে" রেখে)।


1
একটি "সম্পূর্ণ বস্তু" পাস করে না। আপনি মেমরির কোনও জায়গাতে রেফারেন্সটি পাস করেন যা খুব অল্প পরিমাণে ডেটা পাস করা হয়। আমি যে পারফরম্যান্সের তার প্রভাবের বিষয়ে নিশ্চিত নই, তবে তবুও ... এছাড়াও "আউট" চিহ্নিত করে কী বোঝায়?
অ্যাডিসন ক্র্যাম্প

1
আমি আমার বিবৃতি থেকে 'পুরো' শব্দটি বাদ দিয়েছিলাম, এটি বিভ্রান্তিকর ছিল। আমি কখনই পারফরম্যান্স বা আকার চাইনি, উত্তরটি নিখুঁতভাবে প্রোগ্রামিং অনুশীলনের উপর ভিত্তি করে। যাইহোক, প্যারামিটার সংশোধক হিসাবে ব্যবহৃত outএকটি .Netকীওয়ার্ড। এতে বলা হয়েছে যে প্যারামিটারটি রেফারেন্স দ্বারা পাস করা হয়। বিস্তারিত জানার জন্য দেখুন msdn.microsoft.com/en-us/library/t3c3bfhx.aspx
wonderbell

4
প্রথম বাক্যটি সহজভাবে ভুল। আমাদের যদি থাকে class C { int x; static void M() { তবে এম সম্পূর্ণরূপে অ্যাক্সেস করতে সক্ষম x। উদাহরণস্বরূপ int y = (new C()).x;বৈধ।
এরিক লিপার্ট

@ এরিকলিপার্ট :) আমি নিশ্চিত যে আপনি কী বোঝাতে চেয়েছিলেন তা আপনি জানেন। এটি আশ্চর্যজনক যে কীভাবে মাস্টারগুলি লাইনের মধ্যে পড়তে পারে। আমার এই বাক্যটি সম্পাদনের দরকার হতে পারে। স্পষ্টতার জন্য, এর মতো কিছু static void M() { this.x = 1; }সম্ভব নয়।
আশ্চর্যজনক

1
@ ওয়ান্ডারবেল: না, আমি নিশ্চিত আপনি কী বোঝাতে চেয়েছিলেন তা আমি জানতাম না। আমি জানতাম তুমি কী লিখেছ। আমি নোট করি যে this.xভুল হিসাবে না xঅ্যাক্সেস করা যায় thisনা কিন্তু অস্তিত্ব নেই কারণ । এটি মোটেই অ্যাক্সেসের প্রশ্ন নয়, এটি অস্তিত্বের প্রশ্ন ।
এরিক লিপার্ট

4

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

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