উদাহরণস্বরূপ ভেরিয়েবলের চেয়ে স্থানীয় ভেরিয়েবলগুলিকে প্রাধান্য দেওয়ার পক্ষে যুক্তি?


109

আমি যে কোডবেসে প্রায়শই কাজ করছি তা বিভিন্ন তুচ্ছ পদ্ধতির মধ্যে ডেটা ভাগ করতে উদাহরণের ভেরিয়েবল ব্যবহার করে। মূল বিকাশকারী অনড় যে এটি আঙ্কেল বব / রবার্ট মার্টিনের ক্লিন কোড বইয়ে বর্ণিত সর্বোত্তম অনুশীলনের সাথে মেনে চলে : "কার্যকারিতার প্রথম নিয়ম হ'ল তাদের ছোট হওয়া উচিত।" এবং "কোনও ক্রিয়াকলাপের জন্য আদর্শ সংখ্যাটি শূন্য (নীলাদিক) ((...) যুক্তিগুলি কঠোর। তারা অনেকগুলি ধারণাগত শক্তি গ্রহণ করে take"

একটি উদাহরণ:

public class SomeBusinessProcess {
  @Inject private Router router;
  @Inject private ServiceClient serviceClient;
  @Inject private CryptoService cryptoService;

  private byte[] encodedData;
  private EncryptionInfo encryptionInfo;
  private EncryptedObject payloadOfResponse;
  private URI destinationURI;

  public EncryptedResponse process(EncryptedRequest encryptedRequest) {
    checkNotNull(encryptedRequest);

    getEncodedData(encryptedRequest);
    getEncryptionInfo();
    getDestinationURI();
    passRequestToServiceClient();

    return cryptoService.encryptResponse(payloadOfResponse);
  }

  private void getEncodedData(EncryptedRequest encryptedRequest) {
    encodedData = cryptoService.decryptRequest(encryptedRequest, byte[].class);
  }

  private void getEncryptionInfo() {
    encryptionInfo = cryptoService.getEncryptionInfoForDefaultClient();
  }

  private void getDestinationURI() {
    destinationURI = router.getDestination().getUri();
  }

  private void passRequestToServiceClient() {
    payloadOfResponse = serviceClient.handle(destinationURI, encodedData, encryptionInfo);
  }
}

আমি স্থানীয় ভেরিয়েবলগুলি ব্যবহার করে নীচে এটি রিফ্যাক্টর করব:

public class SomeBusinessProcess {
  @Inject private Router router;
  @Inject private ServiceClient serviceClient;
  @Inject private CryptoService cryptoService;

  public EncryptedResponse process(EncryptedRequest encryptedRequest) {
    checkNotNull(encryptedRequest);

    byte[] encodedData = cryptoService.decryptRequest(encryptedRequest, byte[].class);
    EncryptionInfo encryptionInfo = cryptoService.getEncryptionInfoForDefaultClient();
    URI destinationURI = router.getDestination().getUri();
    EncryptedObject payloadOfResponse = serviceClient.handle(destinationURI, encodedData,
      encryptionInfo);

    return cryptoService.encryptResponse(payloadOfResponse);
  }
}

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

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

এবং বিপরীতভাবে, এই রিফ্যাক্টরিংয়ের কোনও ডাউনসাইড রয়েছে যা আমি সম্ভবত উপেক্ষা করেছি?


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ম্যাপেল_শ্যাফ্ট

উত্তর:


170

উদাহরণস্বরূপ ভেরিয়েবলের তুলনায় স্থানীয় ভেরিয়েবলের পক্ষে আনার উদ্দেশ্য, বৈজ্ঞানিক যুক্তি কী?

স্কোপ একটি বাইনারি অবস্থা নয়, এটি গ্রেডিয়েন্ট। এগুলি আপনি বৃহত্তম থেকে ক্ষুদ্রতম পর্যন্ত স্থান দিতে পারেন:

Global > Class > Local (method) > Local (code block, e.g. if, for, ...)

সম্পাদনা করুন: আমি যা "ক্লাস স্কোপ" বলি তা হ'ল "ইনস্ট্যান্স ভেরিয়েবল" বলতে বোঝায়। আমার জ্ঞানের মতে এগুলি সমার্থক, তবে আমি সি # দেব, জাভা দেব নই। বংশবৃদ্ধির স্বার্থে, আমি সমস্ত স্ট্যাটিক্সকে বৈশ্বিক বিভাগে ছড়িয়ে দিয়েছি যেহেতু স্ট্যাটিক্স প্রশ্নের বিষয় নয়।

সুযোগ যত কম হবে তত ভাল the যুক্তিটি হ'ল ভেরিয়েবলগুলি সম্ভব ক্ষুদ্রতম স্কোপে বাস করা উচিত । এর অনেক সুবিধা রয়েছে:

  • এটি আপনাকে বর্তমান বর্গের দায়িত্ব সম্পর্কে চিন্তা করতে বাধ্য করে এবং আপনাকে এসআরপিকে আটকে রাখতে সহায়তা করে।
  • এটা আপনি বিশ্বব্যাপী নামকরণ দ্বন্দ্ব, যেমন যদি দুই বা ততোধিক শ্রেণীর একটি আছে এড়ানো আছে না সক্ষম Nameসম্পত্তি, আপনি তাদের মত তার প্রিফিক্স চাপ থাকে না FooName, BarName... এভাবে যেমন পরিষ্কার এবং সম্ভব হিসাবে বাহুল্যবর্জিত আপনার পরিবর্তনশীল নামের রাখা।
  • প্রাসঙ্গিকভাবে প্রাসঙ্গিক তাদের কাছে উপলব্ধ ভেরিয়েবলগুলি (যেমন: ইন্টেলিসেন্সের জন্য) সীমাবদ্ধ করে কোডটি ডিক্লুটটার করে।
  • এটি অ্যাক্সেস নিয়ন্ত্রণের কিছু ফর্ম সক্ষম করে যাতে আপনার ডেটা এমন কোনও অভিনেতা দ্বারা পরিচালনা করা যায় না যা আপনি জানেন না (যেমন সহকর্মীর দ্বারা বিকশিত একটি পৃথক শ্রেণি)।
  • এটি কোডটিকে আরও পঠনযোগ্য করে তোলে আপনি নিশ্চিত করে যে এই ভেরিয়েবলগুলির ঘোষণাটি এই ভেরিয়েবলগুলির যথাযথ ব্যবহারের কাছাকাছি থাকার চেষ্টা করে।
  • অতিমাত্রায় বিস্তৃত স্কোপগুলিতে ওয়ানওলি ভেরিয়েবলগুলি ঘোষণা করা প্রায়শই এমন বিকাশকারীর ইঙ্গিত দেয় যা OOP পুরোপুরি আঁকড়ে না বা কীভাবে এটি প্রয়োগ করতে পারে। অতিরিক্ত মাত্রায় স্কোপযুক্ত ভেরিয়েবলগুলি লাল পতাকা হিসাবে কাজ করে যে সম্ভবত ওওপি পদ্ধতির সাথে কিছু ভুল হচ্ছে (সাধারণভাবে বিকাশকারী বা নির্দিষ্টভাবে কোডবেসের সাথে)।
  • (কেভিনের মন্তব্য) স্থানীয়দের ব্যবহার আপনাকে সঠিক ক্রমে জিনিসগুলি করতে বাধ্য করে। মূল (শ্রেণীর ভেরিয়েবল) কোডে আপনি ভুলভাবে passRequestToServiceClient()পদ্ধতির শীর্ষে যেতে পারেন এবং এটি এখনও সংকলন করতে পারে। স্থানীয়দের সাথে, আপনি কেবল তখনই সেই ভুলটি করতে পারেন যদি আপনি একটি অনির্ধারিত ভেরিয়েবল পাস করেন, যা আশাবাদী যথেষ্ট যে আপনি আসলে এটি করেন নি।

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

এবং বিপরীতভাবে, এই রিফ্যাক্টরিংয়ের কোনও ডাউনসাইড রয়েছে যা আমি সম্ভবত উপেক্ষা করেছি?

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

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

private byte[] getEncodedData() {
    return cryptoService.decryptRequest(encryptedRequest, byte[].class);
}

private EncryptionInfo getEncryptionInfo() {
    return cryptoService.getEncryptionInfoForDefaultClient();
}

// and so on...

আপনি processপদ্ধতিতে যা করেছেন তার সাথে আমি একমত নই , তবে আপনার দেহগুলি সরাসরি চালিত করার পরিবর্তে আপনার ব্যক্তিগত সাবমেথডদের কল করা উচিত ছিল।

public EncryptedResponse process(EncryptedRequest encryptedRequest) {
    checkNotNull(encryptedRequest);

    byte[] encodedData = getEncodedData();
    EncryptionInfo encryptionInfo = getEncryptionInfo();

    //and so on...

    return cryptoService.encryptResponse(payloadOfResponse);
}

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

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


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ম্যাপেল_শ্যাফ্ট

79

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


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

1
আমি বলব বইটির অর্থ এটি নয়। কতগুলি ফাংশন চালাতে হুবুহ ইনপুট ডেটা প্রয়োজন? এই বিটগুলির মধ্যে একটি আমার মনে হয় বইটিতে ভুল ছিল।
কিওয়ার্টি

1
@ কিওয়ার্টি আপনার যদি কোনও অবজেক্ট থাকে তবে এটি যে ডেটা এতে কাজ করে তা সম্পূর্ণরূপে এটির ভিতরে আবৃত থাকতে পারে। মতো কাজগুলির process.Start();বা myString.ToLowerCase()খুব অদ্ভুত মনে হচ্ছে (এবং নিশ্চয়ই সবচেয়ে সহজ পদ্ধিতি হল বুঝতে) করা উচিত নয়।
আর স্মিটজ

5
উভয়ের একটি যুক্তি রয়েছে: অন্তর্নিহিত this। এমনকি কেউ যুক্তি দিতে পারে এই যুক্তিটি স্পষ্টভাবে দেওয়া হয়েছে - বিন্দুর আগে।
ব্ল্যাকজ্যাক

47

অন্যান্য উত্তরগুলি ইতিমধ্যে স্থানীয় ভেরিয়েবলগুলির সুবিধাগুলি পুরোপুরি ব্যাখ্যা করেছে, সুতরাং যা অবশিষ্ট রয়েছে তা আপনার প্রশ্নের এই অংশ:

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

এটি সহজ হওয়া উচিত। আঙ্কেল ববসের ক্লিন কোডে কেবল তাকে নিম্নোক্ত উদ্ধৃতিটির দিকে নির্দেশ করুন:

কোন পার্শ্ব প্রতিক্রিয়া আছে

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

(উদাহরণ বাদ দেওয়া)

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

এটি म्हणजे, চাচা বব কেবল এটিই বলেন না যে কোনও ফাংশনটিতে কয়েকটি যুক্তি নেওয়া উচিত, তিনি আরও বলেছেন যে যখনই সম্ভব হয় তখন ফাংশনগুলি অ-স্থানীয় রাষ্ট্রের সাথে যোগাযোগ করা এড়ানো উচিত।


3
একটি "প্রেফেক্ট ওয়ার্ল্ড" এ, এটি তালিকাভুক্ত দ্বিতীয় উত্তর হবে। সহকর্মী কারণ শোনার আদর্শ পরিস্থিতির জন্য প্রথম উত্তর - তবে সহকর্মী যদি একজন উদ্যোগী হন তবে এই উত্তরটি খুব বেশি ঝোঁক ছাড়াই পরিস্থিতি মোকাবেলা করবে।
আর স্মিটজ

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

1
আহ, ভাল পুরানো "একটি পরস্পরবিরোধী স্বতঃস্ফূর্তভাবে, এটি কোনও কিছুর প্রমাণ করা সম্ভব"। যেহেতু কোনও কঠোর সত্য এবং মিথ্যা আইআরএল নেই, তাই কোনও ডগমাসের বিপরীত বিষয়গুলি যেমন বিরোধী হতে পারে এমন বিবৃতি অন্তর্ভুক্ত করতে হবে।
ivan_pozdeev

26

"এটি কারও চাচা যা ভাবেন তার বিরোধিতা করে" একটি ভাল যুক্তি নেই। না। চাচাদের কাছ থেকে জ্ঞান নেবেন না, নিজের জন্য চিন্তা করুন।

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

পরীক্ষা: প্রতিটি উদাহরণ ভেরিয়েবলের জন্য একটি ডকুমেন্টেশন মন্তব্য লিখুন Write আপনি সম্পূর্ণরূপে অর্থহীন নয় এমন কিছু লিখতে পারেন? এবং চারটি প্রবেশকারীর কাছে একটি ডকুমেন্টেশন মন্তব্য লিখুন। তারাও সমান অর্থহীন।

সবচেয়ে খারাপটি হল, পরিবর্তনগুলি ডিক্রিপ্ট করার উপায়টি ধরে নিন কারণ আপনি একটি পৃথক ক্রিপ্টো সার্ভিস ব্যবহার করেন। কোডের চারটি লাইন পরিবর্তন করার পরিবর্তে, আপনাকে চারটি সংখ্যার ভেরিয়েবলগুলি বিভিন্নগুলির সাথে, চারটি গেটরকে বিভিন্নগুলির সাথে এবং চারটি কোডের কোড পরিবর্তন করতে হবে।

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

(এই গুরুত্বপূর্ণ পয়েন্টটি মিস করেছেন যে স্থানীয় ভেরিয়েবলগুলি আপনাকে কলকে সঠিক ক্রমে বাধ্য করতে বাধ্য করে)।


16
নিজের জন্য ভাবনা অবশ্যই ভাল is তবে আপনার খোলার অনুচ্ছেদে কার্যকরভাবে শিখর বা জুনিয়রকে শিক্ষক বা সিনিয়রদের ইনপুট বাতিল করে দেওয়া রয়েছে; যা অনেক দূরে যায়।
উত্তেজিত

9
@ ফ্লাটার শিক্ষক বা সিনিয়রদের ইনপুট সম্পর্কে চিন্তা করার পরে এবং তারা ভুল বলে দেখে তাদের ইনপুটকে বরখাস্ত করা একমাত্র সঠিক জিনিস। শেষ পর্যন্ত, এটি বরখাস্ত করার বিষয়ে নয়, তবে এটি প্রশ্নবিদ্ধ করার এবং কেবলমাত্র যদি এটি অবশ্যই ভুল প্রমাণিত হয় তবে তা বরখাস্ত করার বিষয়ে।
glglgl

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

9
একটি ভাগ করে নেওয়ার জ্ঞান প্ল্যাটফর্মে, এটি জায়গা থেকে একটু দূরে বলে মনে হচ্ছে ...
drjpizzle

4
কখনও ভাল যুক্তি কখনও নেই ... আমি পুরোপুরি সম্মত হই যে নিয়মগুলি নির্দেশনা দেওয়ার জন্য, নির্দেশনা দেওয়ার জন্য নয়। যাইহোক, বিধি সম্পর্কে নিয়মগুলি বিধিগুলির একটি সাবক্লাস মাত্র, সুতরাং আপনি নিজের রায়টি বলেছিলেন ...
মার্শ

14

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

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

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

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


7
এখনও অবধি, এটিই একমাত্র উত্তর যা থ্রেড-সুরক্ষা এবং সম্মতিতে উল্লেখ করেছে। প্রশ্নে নির্দিষ্ট কোড উদাহরণ দেওয়া এমন এক ধরণের আশ্চর্যজনক: সামুবসনেসপ্রসেসের একটি উদাহরণ একসাথে একাধিক এনক্রিপ্ট করা অনুরোধগুলি নিরাপদে প্রক্রিয়া করতে পারে না। পদ্ধতিটি public EncryptedResponse process(EncryptedRequest encryptedRequest)সিঙ্ক্রোনাইজ করা হয় নি, এবং সমবর্তী কলগুলি সম্ভবত সম্ভাব্য ভেরিয়েবলের মানগুলি ক্লোবার করে। এটি সামনে আনার জন্য একটি ভাল পয়েন্ট।
জোশুয়া টেলর

9

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

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

public class SomeBusinessProcess {
  @Inject private Router router;
  @Inject private ServiceClient serviceClient;
  @Inject private CryptoService cryptoService;

  public EncryptedResponse process(EncryptedRequest request) {
    checkNotNull(encryptedRequest);

    return encryptResponse
      (routeTo
         ( destination()
         , requestData(request)
         , destinationEncryption()
         )
      );
  }

  private byte[] requestData(EncryptedRequest encryptedRequest) {
    return cryptoService.decryptRequest(encryptedRequest, byte[].class);
  }

  private EncryptionInfo destinationEncryption() {
    return cryptoService.getEncryptionInfoForDefaultClient();
  }

  private URI destination() {
    return router.getDestination().getUri();
  }

  private EncryptedObject routeTo(URI destinationURI, byte[] encodedData, EncryptionInfo encryptionInfo) {
    return serviceClient.handle(destinationURI, encodedData, encryptionInfo);
  }

  private void encryptResponse(EncryptedObject payloadOfResponse) {
    return cryptoService.encryptResponse(payloadOfResponse);
  }
}

এটি এমন একটি উপস্থাপনা যা কোনও সুযোগে ভেরিয়েবলের প্রয়োজনীয়তা সরিয়ে দেয়। হ্যাঁ সংকলক এগুলি উত্পন্ন করবে তবে গুরুত্বপূর্ণ অংশটি হ'ল এটি নিয়ন্ত্রণ করে যে কোডটি কার্যকর হবে। তুলনামূলকভাবে সুগঠিত থাকার সময়ও।

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


4
সমস্ত ভেরিয়েবলগুলি অপসারণ করা অগত্যা কোডগুলি পড়া সহজ করে না।
ফারাপ

সম্পূর্ণরূপে pointfree শৈলী সঙ্গে সব ভেরিয়েবল বর্জন করুন en.wikipedia.org/wiki/Tacit_programming
মার্সিন

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

7

আমি কেবল এই ভেরিয়েবল এবং ব্যক্তিগত পদ্ধতিগুলি পুরোপুরি সরিয়ে ফেলব। এখানে আমার রিফ্যাক্টর:

public class SomeBusinessProcess {
  @Inject private Router router;
  @Inject private ServiceClient serviceClient;
  @Inject private CryptoService cryptoService;

  public EncryptedResponse process(EncryptedRequest encryptedRequest) {
    return cryptoService.encryptResponse(
        serviceClient.handle(router.getDestination().getUri(),
        cryptoService.decryptRequest(encryptedRequest, byte[].class),
        cryptoService.getEncryptionInfoForDefaultClient()));
  }
}

ব্যক্তিগত পদ্ধতির জন্য, যেমন router.getDestination().getUri()পরিষ্কার এবং এর চেয়ে বেশি পঠনযোগ্য getDestinationURI()। আমি এমনকি কেবল পুনরাবৃত্তি করব যদি আমি একই ক্লাসে দু'বার একই লাইনটি ব্যবহার করি। এটি অন্যভাবে দেখার জন্য, যদি কোনওটির প্রয়োজন হয় getDestinationURI()তবে এটি সম্ভবত শ্রেণিতে নয় অন্য কোনও শ্রেণির অন্তর্গত SomeBusinessProcess

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

যাইহোক, ক্লাসটি কেবল করা দরকার process()এবং তারপরে বস্তুটি ফেলে দেওয়া হবে, কোনও রাষ্ট্রকে স্মৃতিতে রাখার দরকার নেই। আরও রিফ্যাক্টর সম্ভাবনা ক্রিপ্টো সার্ভিসটিকে সেই শ্রেণীর বাইরে নিয়ে যাওয়া।

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

public class SomeBusinessProcess {
  @Inject private Router router;
  @Inject private ServiceClient serviceClient;

  public Response process(Request request) {
    return serviceClient.handle(router.getDestination().getUri());
  }
}

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

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


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

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

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

@ জোপ এগজেন হ্যাঁ, বিমূর্ততা অর্থপূর্ণ। উদাহরণস্বরূপ, ব্যক্তিগত পদ্ধতিগুলি যাইহোক কোনও বিমূর্ততা দেয় না, শ্রেণীর ব্যবহারকারীরা তাদের সম্পর্কে এমনকি জানেন না
imel96

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

4

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

নোট করুন যে এমন একটি ফাংশন যা ডেটা প্রক্রিয়াকরণ করে এবং এমন একটি ফাংশন যা কেবল ডেটা অ্যাক্সেস করে

প্রাক্তন প্রকৃত ব্যবসায়িক যুক্তি সম্পাদন করে, যেখানে পরবর্তীকালে টাইপিং সংরক্ষণ হয় এবং সম্ভবত একটি সহজ এবং আরও পুনরায় ব্যবহারযোগ্য ইন্টারফেস যুক্ত করে সুরক্ষা যুক্ত করা হয়।

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

নামযুক্ত ফাংশনগুলিতে কেবল ব্যবসায়ের যুক্তি রেখে, আমরা উভয় বিশ্বের সেরা (কোথাও ফ্ল্যাটারের উত্তর এবং আইমেল 96 এর উত্তরের মধ্যে ) পাই :

public EncryptedResponse process(EncryptedRequest encryptedRequest) {

    byte[] requestData = decryptRequest(encryptedRequest);
    EncryptedObject responseData = handleRequest(router.getDestination().getUri(), requestData, cryptoService.getEncryptionInfoForDefaultClient());
    EncryptedResponse response = encryptResponse(responseData);

    return response;
}

// define: decryptRequest(), handleRequest(), encryptResponse()

3

প্রথম এবং সর্বাধিক গুরুত্বপূর্ণ বিষয়: চাচা বব কখনও কখনও প্রচারকের মতো বলে মনে হয় তবে তার বিধিগুলিতে ব্যতিক্রম রয়েছে are

পরিষ্কার কোডের পুরো ধারণাটি হ'ল পাঠযোগ্যতা উন্নত করা এবং ত্রুটিগুলি এড়ানো। একে অপরকে লঙ্ঘন করছে এমন বেশ কয়েকটি বিধি রয়েছে।

ফাংশন সম্পর্কে তার যুক্তি হ'ল নীলাদিক কার্যগুলি সর্বোত্তম, তবে তিনটি পরামিতি গ্রহণযোগ্য। আমি ব্যক্তিগতভাবে মনে করি 4 টিও ঠিক আছে।

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

চলকগুলি যা শ্রেণীর অনেক স্থানে ব্যবহৃত হয় না, সরানো উচিত।

আমি আসল বা রিফ্যাক্টরড সংস্করণটিকে সর্বোত্তম বিবেচনা করব না এবং @ ফ্লেটার ইতিমধ্যে খুব ভাল বলেছে যে রিটার্ন মানগুলি কী করা যায়। এটি পাঠযোগ্যতা উন্নত করে এবং ফেরতের মানগুলি ব্যবহার করতে ত্রুটি হ্রাস করে।


1

স্থানীয় ভেরিয়েবলগুলি সুযোগকে হ্রাস করে তাই ভেরিয়েবলগুলি যেভাবে ব্যবহার করা যায় সেগুলি সীমিত করে এবং তাই নির্দিষ্ট শ্রেণীর ত্রুটি প্রতিরোধে সহায়তা করে এবং পাঠযোগ্যতার উন্নতি করে।

ইনস্ট্যান্স ভেরিয়েবল এমনভাবে হ্রাস করে যেখানে ফাংশনটি বলা যেতে পারে যা নির্দিষ্ট শ্রেণীর ত্রুটি হ্রাস করতে সহায়তা করে এবং পাঠযোগ্যতার উন্নতি করে।

একটি সঠিক এবং অন্যটি ভুল বলতে কোনও একটি বিশেষ ক্ষেত্রে কার্যকর বৈধ সিদ্ধান্ত হতে পারে, তবে সাধারণ পরামর্শ হিসাবে ...

টিএল; ডিআর: আমি মনে করি যে আপনি অত্যধিক উদ্যোগের ঘ্রাণ নিচ্ছেন তা হ'ল অনেক বেশি উত্সাহ।


0

Get ... দিয়ে শুরু হওয়া পদ্ধতিগুলি অকার্যকর হওয়া উচিত নয় সত্ত্বেও, পদ্ধতিগুলির মধ্যে বিমূর্ততার স্তরগুলির পৃথকীকরণ প্রথম সমাধানে দেওয়া হয়। যদিও দ্বিতীয় সমাধানটি আরও স্কোপড করা হয়েছে তবে পদ্ধতিতে কী চলছে তা নিয়ে तर्क করা এখনও শক্ত। স্থানীয় ভেরিয়েবলের অ্যাসাইনমেন্টের প্রয়োজন নেই। আমি পদ্ধতির নামগুলি রাখি এবং কোডটিকে এমন কিছুতে রিফ্যাক্টর করতাম:

public class SomeBusinessProcess {
  @Inject private Router router;
  @Inject private ServiceClient serviceClient;
  @Inject private CryptoService cryptoService;

  public EncryptedResponse process(EncryptedRequest encryptedRequest) {
    checkNotNull(encryptedRequest);

    return getEncryptedResponse(
            passRequestToServiceClient(getDestinationURI(), getEncodedData(encryptedRequest) getEncryptionInfo())
        );
  }

  private EncryptedResponse getEncryptedResponse(EncryptedObject encryptedObject) {
    return cryptoService.encryptResponse(encryptedObject);
  }

  private byte[] getEncodedData(EncryptedRequest encryptedRequest) {
    return cryptoService.decryptRequest(encryptedRequest, byte[].class);
  }

  private EncryptionInfo getEncryptionInfo() {
    return cryptoService.getEncryptionInfoForDefaultClient();
  }

  private URI getDestinationURI() {
    return router.getDestination().getUri();
  }

  private EncryptedObject passRequestToServiceClient(URI destinationURI, byte[] encodedData, EncryptionInfo encryptionInfo) {
    return serviceClient.handle(destinationURI, encodedData, encryptionInfo);
  }
}

0

উভয় জিনিষ একই এবং কর্মক্ষমতা পার্থক্য কেউ খেয়াল করে হয় না, তাই আমি একটা মনে করি না বৈজ্ঞানিক যুক্তি। এটি তখন বিষয়গত পছন্দগুলিতে নেমে আসে।

এবং আমিও আপনার সহকর্মীর চেয়ে আপনার পথটি আরও ভাল পছন্দ করি। কেন? কারণ আমি মনে করি কিছু বইয়ের লেখক যা বলেছেন তা সত্ত্বেও এটি পড়া এবং বুঝতে সহজ।

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

বিপরীতে, আপনার দৃষ্টিভঙ্গি সবকিছুকে আরও বেশি ঘন করে তোলে, তবে এটিকে দুর্ভেদ্য করা যায় না। আপনি কেবল লাইনের পরে এটি লাইন পড়েন এবং এটি বুঝতে আপনার এত মুখস্ত করার দরকার নেই।

তবে যদি সে এর ব্যবহার যেমন একটি ফ্যাশন পরিপূর্ণ হচ্ছে কোডে, আমি কল্পনা করতে পারি যে তার জন্য এটি অন্যান্য উপায় বৃত্তাকার হতে পারে।


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