"কী" এবং "সন্ধান করুন" উপসর্গ সহ নামকরণের পদ্ধতিগুলির মধ্যে কীভাবে এবং কেন সিদ্ধান্ত নেওয়া যায়


48

getSomethingবনাম দিয়ে শুরু করে কোনও নির্দিষ্ট পদ্ধতির নাম দেওয়া উচিত কিনা তা জানার ক্ষেত্রে আমার সর্বদা সমস্যা হয় findSomething

সমস্যাটি খারাপভাবে ডিজাইন করা এপিআইয়ের সাহায্যকারী তৈরিতে থাকে । এটি সাধারণত কোনও অবজেক্ট থেকে ডেটা পাওয়ার সময় ঘটে থাকে, যার জন্য প্যারামিটার হিসাবে বস্তুর প্রয়োজন হয়। এখানে একটি সহজ উদাহরণ:

public String getRevision(Item item) {
    service.load(item, "revision");
    // there is usually more work to do before getting the data..
    try {
        return item.get_revision();
    }
    catch(NotLoadedException exception) {
        log.error("Property named 'property_name' was not loaded", exception);
    }
    return null;
}

কীভাবে এবং কেন এই পদ্ধতির নামকরণের মধ্যে getRevision()বা কেন সিদ্ধান্ত নেবেন findRevision()?


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

1
এই ধারণার কথা আগে কখনও শুনিনি। উদাহরণগুলির সাথে আপনার আরও ভাল লিঙ্ক রয়েছে?
জ্ঞাতসিল্যা

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

উত্তর:


83

আমি Getযখন জানব পুনরুদ্ধারের সময়টি খুব কম হবে (হ্যাশ টেবিল বা বিট্রি থেকে দেখার মতো) I

Findএকটি অনুসন্ধান প্রক্রিয়া বা গণ্য অ্যালগরিদমকে বোঝায় যা সম্পাদন করতে "দীর্ঘ" সময় প্রয়োজন (কিছুটা স্বেচ্ছাকৃত মানের জন্য)।


3
+1 আমি পুনরুদ্ধার করার সময় get ব্যবহার করি এবং কখন কোনও কাজ করার জন্য কাজ করতে হয় তা সন্ধান করি।
জিম

5
এই কোডটি পরিবর্তন করে (কিছু অংশ অনুকূলিত হয়ে যায় এবং অ্যালগরিদমের পরিবর্তন হয়) এবং এপিআই পরিবর্তন করা প্রায়শই অসম্ভব এটি সঠিক মানদণ্ডের মতো দেখায় না। আপনি যদি findপরে হ্যাশ-টেবিল অ্যালগরিদম দিয়ে প্রতিস্থাপন করেন তবে আপনি কী করবেন ?
মেজে

2
আমি একটি কলটি পড়ার সময়ও ধরে নেব, যখন অনুসন্ধান সফল হয় না তখন "ফাইন্ড" বলা যেতে পারে কারণ অনুসন্ধানের মানদণ্ডটি সফল হয় না, যখন কিছু অস্বাভাবিক সমস্যা না হলে "get" সফল হবে বলে আশা করা হচ্ছে।
gnasher729

যদি ফাংশনটি কোনও শর্তের ভিত্তিতে ফলাফলগুলি ফিল্টার করতে একটি optionচ্ছিক পরামিতি গ্রহণ করে? উভয় getএবং findএটি কীভাবে ব্যবহার উপর নির্ভর করে প্রয়োগ করবে।
ESR

61

আমি বলব যে findএটি ব্যর্থ হতে পারে তবে করা getউচিত নয়।


25
যদি আপনি বোঝাতে চেয়ে থাকেন যে findNULL ফেরত getআসতে পারে তবে কখনই NULL ফেরত আসবে না তবে নিক্ষেপ করতে পারে (বা জোর দেওয়া), আমি সম্মত।
Sjoerd

1
আমি এতে @ সোজার্ডের সাথে পুরোপুরি একমত
mhr

আর যদি find()ফিরবে Optional<>? যে ক্ষেত্রে findহয় nullনিরাপদ।
TheCoder

42

আমার বাচ্চাদের সাথে প্রায়শই একটি কথোপকথনের উদ্ধৃতি দিতে:

আমি: আরে বাচ্চা! আমাকে কিছু ব্যাটারি সন্ধান করুন

ছোকরা: তবে তারা কোথায়?

আমি: এ কারণেই আমি আপনাকে বলেছিলাম যে সেগুলি সন্ধান কর। যদি আমি জানতাম যেখানে তারা ছিল, আমি যেতে তোমাদের বলতাম পেতে তাদের। অথবা আপনি আপনার মাকে জিজ্ঞাসা করতে পারেন।

একই ধারণা ধারণ করে:

  • কোনও পদ্ধতির জন্য "get" ব্যবহার করুন যা সস্তার তুলনায় সহজলভ্য তথ্যের টুকরো ফেরত দেয় (এবং সম্ভবত এটি অন্তর্ভুক্ত করা যেতে পারে বা অন্যথায় অনুকূলিত করা যেতে পারে), বা এই অবজেক্টের মালিকানাধীন স্বতন্ত্র তথ্যের একটি অংশের জন্য।

  • এমন কোনও পদ্ধতির জন্য "সন্ধান করুন" ব্যবহার করুন যা কোনও তথ্য সংগ্রহ করার জন্য কাজ করে বা এটি খুঁজে পেতে অন্য বস্তু ব্যবহার করে।


16
কেবলমাত্র একজন প্রোগ্রামার তাদের বাচ্চাদের সাথে এই কথোপকথনটি করতে পারে। "আপনি আবর্জনা নিতে চান?" "সংখ্যা" "আপনি আবর্জনা ফেলবেন?" "হ্যাঁ."
রবার্ট হার্ভে

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

3

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


3

আমি নিম্নলিখিত প্যাটার্নটি প্রয়োগ করি:

  • Foo GetFoo() নাল ফিরতে পারে না এবং এটি জটিলতা হ'ল লগ (এন) বা তার চেয়ে কম
  • bool TryGetFoo(out Foo) নাল ফিরে আসতে পারে এবং এটি জটিলতা হ'ল লগ (এন) বা তার চেয়ে কম less
  • Foo FindFoo() নাল ফিরতে পারবেন না এবং এটি জটিলতা ও (লগ (এন)) এর চেয়ে বেশি
  • bool TryFindFoo(out Foo) নাল ফিরে আসতে পারে এবং এটি জটিলতা ও (লগ (এন)) এর চেয়ে বেশি

এই উদ্দেশ্যটি এবং আপনি যে জটিলতাটি আশা করতে পারেন তার উপর কোডটি বেশ পরিষ্কার।

সাধারণত, প্রাপ্তরা সরাসরি তালিকা বা অভিধান / সেট অ্যাক্সেসের জন্য।
অনুসন্ধানকারীরা গভীর অনুসন্ধান, তালিকার সম্পূর্ণ স্ক্যান ইত্যাদি ...

আপনার ক্ষেত্রে:

public bool TryGetRevision( Item item, out String revision ) 
{
    service.load( item, "revision" );
    // there is usually more work to do before getting the data..
    try 
    {
        revision = item.get_revision();
        return true;
    }
    catch( NotLoadedException exception )
    {
        log.error( "Property named 'property_name' was not loaded", exception );
        revision = "";
        return false;
    }
}

tryসংক্ষিপ্ত এবং সুনির্দিষ্ট জন্য +1
স্পেসট্রকার

2

getযে কোনও ক্ষেত্রেই উপযুক্ত - আসলে এটি প্রায়শই ধরে নেওয়া হয় যে কিছু পাওয়ার জন্য আপনাকে প্রথমে এটি সন্ধান করা উচিত। সুতরাং আপনি যদি নিশ্চিত না হন, ব্যবহার করুন get

আমি findযেমন ব্যবহার করতে চাইছি findMinimum()বা findOptimal()যেমন, যেখানে কিছু বিশেষ অ্যালগরিদম রয়েছে যা রিটার্ন মানটি গণনা করে, এবং কেবল কোনও ডেটা পাওয়ার জন্য ডিবি, ফাইল সিস্টেম, রিমোট সার্ভার ইত্যাদিতে অনুরোধ করে না।


1
ভাল দিক. findআপনার দেওয়া উদাহরণগুলিতে ব্যক্তিগতভাবে আমি সম্ভবত উপসর্গ হিসাবে ব্যবহার করব না । গণনার কাজগুলির জন্য, যেমন আপনার উদাহরণের মতো আমিও ব্যবহার করব calculateবা করব compute
জ্ঞাতসিল্যা

2

সন্ধান বা উপসর্গগুলি ব্যবহার করবেন না। এটি বার্ট্র্যান্ড মেয়ারের দ্বারা প্রস্তুত করা ইউনিফর্মএ্যাক্সেসপ্রিন্সিপাল লঙ্ঘন । নীচের মতো একটি পদ্ধতি তৈরি করবেন না কেন:

public String revision(Item item)

আমি তোমার সাথে পুরোপুরি একমত, দুর্দান্ত !!!!
ইরাকলি গ্যাবিসোনিয়া

1

আমি সাধারণত Getকোনও অবজেক্ট / মান Findপুনরুদ্ধার করতে এবং এর অবস্থান পুনরুদ্ধার করতে ব্যবহার করব (উদাহরণস্বরূপ একটি অ্যারেতে)।

প্রাক্তন জন্য:

object o = obj.GetItem( 'name');

integer i = somearray.Find( 'name');

0

আমার কাছে, findবোঝা যাচ্ছে সেখানে সম্ভবত একাধিক ফলাফল উপস্থিত হতে পারে। getকেবল একটিই বোঝায়।


8
মনে হচ্ছে এটির মতো অনুভূতি রয়েছে তবে আমি নিশ্চিত নই যে আমি সম্পূর্ণ একমত। এটিকে এভাবে ভাবুন: getCatবনাম findCatবনাম getCatsবনাম findCatsfind..এখনো প্রতিনিধিত্ব করে একবচন বস্তু ফিরে হচ্ছে। বহুবচনটি আমার মতে, বিশেষ্যটিতে যুক্ত করা উচিত।
জ্ঞাতসূল্যা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.