এটি প্রায়শই এক সাথে কল করা এবং একবার কল করার চেয়ে প্রিন্টলন () কে কল করা কত খারাপ?


23

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

উদাহরণস্বরূপ এটি থাকা কতটা কম দক্ষ

System.out.println("Good morning.");
System.out.println("Please enter your name");

বনাম

System.out.println("Good morning.\nPlease enter your name");

উদাহরণস্বরূপ পার্থক্যটি কেবলমাত্র একটি কল println()কিন্তু এটি আরও বেশি হলে কী হবে?

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

System.out.println("Good morning everyone. I am here today to present you with a very, very lengthy sentence in order to prove a point about how it looks strange amongst other code.");

ভাষার ক্ষেত্রে যেমন সি / সি ++ এর ক্ষেত্রেও একই কথা, যেহেতু প্রতিটি সময় কোনও আউটপুট স্ট্রিমে ডেটা লেখা হয় তখন একটি সিস্টেম কল করা উচিত এবং প্রক্রিয়াটি অবশ্যই কার্নেল মোডে চলে (যা খুব ব্যয়বহুল)?


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

@ সিমোনআন্ড্রে ফোর্সবার্গ আমি নিশ্চিত নই যে এটি জাভাতে প্রযোজ্য কিনা কারণ এটি ভার্চুয়াল মেশিনে চালিত হয় তবে সি / সি ++ এর মতো নিম্ন স্তরের ভাষাগুলিতে আমি কল্পনা করব যে প্রতিবার কোনও আউটপুট প্রবাহে কোনও সিস্টেম কল লিখলে এটি ব্যয়বহুল হবে imagine তৈরি করা আবশ্যক।

: এই খুব বিবেচনা করতে stackoverflow.com/questions/21947452/...
hjk

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

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

উত্তর:


29

এখানে দুটি 'বাহিনী' রয়েছে, টেনশনে: পারফরম্যান্স বনাম পঠনযোগ্যতা।

আসুন প্রথমে তৃতীয় সমস্যাটি লম্বা লাইনগুলি মোকাবেলা করুন:

System.out.println("Good morning everyone. I am here today to present you with a very, very lengthy sentence in order to prove a point about how it looks strange amongst other code.");

এটি কার্যকর করার এবং পাঠযোগ্যতা বজায় রাখার সর্বোত্তম উপায় হ'ল স্ট্রিং কনটেনটেশন ব্যবহার করা:

System.out.println("Good morning everyone. I am here today to present you "
                 + "with a very, very lengthy sentence in order to prove a "
                 + "point about how it looks strange amongst other code.");

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

এখন, সম্পর্কে:

System.out.println("Good morning.");
System.out.println("Please enter your name");

বনাম

System.out.println("Good morning.\nPlease enter your name");

দ্বিতীয় বিকল্পটি উল্লেখযোগ্যভাবে দ্রুত। আমি প্রায় 2 এক্স দ্রুত হিসাবে পরামর্শ দেব .... কেন?

কারণ 90% (ত্রুটির বিস্তৃত মার্জিন সহ) কাজটি অক্ষরগুলিকে আউটপুটে ডাম্প করার সাথে সম্পর্কিত নয়, তবে এটি লিখতে আউটপুট সুরক্ষিত করার জন্য ওভারহেডের প্রয়োজন।

সিংক্রোনাইজ

System.outএকটি PrintStream। সমস্ত জাভা বাস্তবায়ন যা আমি জানি, অভ্যন্তরীণভাবে প্রিন্টস্ট্রিমটি সিঙ্ক্রোনাইজ করে: গ্রেপকোডে কোডটি দেখুন!

এটি আপনার কোডের অর্থ কী?

এর অর্থ হ'ল প্রতিবার যখন আপনি কল System.out.println(...)করবেন তখন আপনার মেমরির মডেলটি সিঙ্ক্রোনাইজ করছেন, আপনি পরীক্ষা করছেন এবং লকের জন্য অপেক্ষা করছেন। System.out কলকারী অন্য কোনও থ্রেডগুলিও লক হয়ে যাবে।

একক থ্রেডযুক্ত অ্যাপ্লিকেশনগুলিতে এর প্রভাবটি System.out.println()প্রায়শই আপনার সিস্টেমের আইও পারফরম্যান্সের মাধ্যমে সীমাবদ্ধ থাকে আপনি ফাইলটিতে কত দ্রুত লিখতে পারেন। মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলিতে লকিং আইও-র চেয়ে বেশি ইস্যু হতে পারে।

অনিদ্রা

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

কিছু নম্বর

আমি নীচের ছোট্ট পরীক্ষাটি একসাথে রেখেছি:

public class ConsolePerf {

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            benchmark("Warm " + i);
        }
        benchmark("real");
    }

    private static void benchmark(String string) {
        benchString(string + "short", "This is a short String");
        benchString(string + "long", "This is a long String with a number of newlines\n"
                  + "in it, that should simulate\n"
                  + "printing some long sentences and log\n"
                  + "messages.");

    }

    private static final int REPS = 1000;

    private static void benchString(String name, String value) {
        long time = System.nanoTime();
        for (int i = 0; i < REPS; i++) {
            System.out.println(value);
        }
        double ms = (System.nanoTime() - time) / 1000000.0;
        System.err.printf("%s run in%n    %12.3fms%n    %12.3f lines per ms%n    %12.3f chars per ms%n",
                name, ms, REPS/ms, REPS * (value.length() + 1) / ms);

    }


}

কোড তুলনামূলকভাবে সহজ, এটি বার বার হয় একটি সংক্ষিপ্ত, বা আউটপুট একটি দীর্ঘ স্ট্রিং প্রিন্ট। লম্বা স্ট্রিংয়ের এতে একাধিক নতুন লাইন রয়েছে। এটি প্রতিটি 1000 এর পুনরাবৃত্তি মুদ্রণ করতে কত সময় নেয় তা পরিমাপ করে।

যদি আমি UNIX (লিনাক্সের) এ এটি চালানোর কম্যান্ড-প্রম্পট, এবং পুনর্নির্দেশ STDOUTকরতে /dev/null, এবং প্রকৃত ফলাফল প্রিন্ট STDERR, আমি নিম্নলিখিতগুলি করতে পারেন:

java -cp . ConsolePerf > /dev/null 2> ../errlog

আউটপুট (এরর্লগে) এর মতো দেখাচ্ছে:

Warm 0short run in
           7.264ms
         137.667 lines per ms
        3166.345 chars per ms
Warm 0long run in
           1.661ms
         602.051 lines per ms
       74654.317 chars per ms
Warm 1short run in
           1.615ms
         619.327 lines per ms
       14244.511 chars per ms
Warm 1long run in
           2.524ms
         396.238 lines per ms
       49133.487 chars per ms
.......
Warm 99short run in
           1.159ms
         862.569 lines per ms
       19839.079 chars per ms
Warm 99long run in
           1.213ms
         824.393 lines per ms
      102224.706 chars per ms
realshort run in
           1.204ms
         830.520 lines per ms
       19101.959 chars per ms
reallong run in
           1.215ms
         823.160 lines per ms
      102071.811 chars per ms

এটার মানে কি? আমি শেষ 'স্তবকের' পুনরাবৃত্তি করি:

realshort run in
           1.204ms
         830.520 lines per ms
       19101.959 chars per ms
reallong run in
           1.215ms
         823.160 lines per ms
      102071.811 chars per ms

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

দীর্ঘমেয়াদে প্রতি-সেকেন্ডে অক্ষরের সংখ্যা 5 গুণ বেশি, এবং অতিবাহিত সময়টি প্রায় .....

অন্য কথায়, আপনার সম্পাদনাটি আপনার যে ছাপানো প্রিন্টলনের সংখ্যার সাথে সম্পর্কিত, তারা কী প্রিন্ট করে তা নয় ।

আপডেট: আপনি যদি কোনও ফাইলকে / dev / নাল পরিবর্তে পুনর্নির্দেশ করেন তবে কি হবে?

realshort run in
           2.592ms
         385.815 lines per ms
        8873.755 chars per ms
reallong run in
           2.686ms
         372.306 lines per ms
       46165.955 chars per ms

এটি পুরো অনেক ধীর, তবে অনুপাতগুলি প্রায় একই ....


কিছু পারফরম্যান্স নম্বর যুক্ত।
রোলফল

আপনাকে সেই সমস্যাটিও বিবেচনা "\n"করতে হবে যা সঠিক লাইনের টার্মিনেটর নাও হতে পারে। printlnসঠিক অক্ষর (গুলি) দিয়ে লাইনটি স্বয়ংক্রিয়ভাবে শেষ হয়ে যাবে তবে \nসরাসরি আপনার স্ট্রিংয়ের সাথে লেগে থাকা সমস্যার কারণ হতে পারে। আপনি যদি এটি সঠিকভাবে করতে চান তবে আপনার স্ট্রিং ফর্ম্যাটিং বা line.separatorসিস্টেমের সম্পত্তি ব্যবহারের প্রয়োজন হতে পারে । printlnঅনেক পরিষ্কার।
ব্যবহারকারী 2357112

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

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

6
এছাড়া যে মনে রাখা গুরুত্বপূর্ণ কেউ যখন ফাংশন ডান পাশে রাখা সব সময়ে যে গতি বিষয় যে ব্যবহারকারীর ইনপুট উপর অপেক্ষা করে।
vmrob

2

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

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

সুতরাং মূল প্রশ্নের উত্তর দিতে। আমি বলব, খারাপ না যদি আপনি printlnবেশিরভাগ লোকেরা যেমন ব্যবহার করেন তবে কিছু জিনিস মুদ্রণ করতে ব্যবহার printlnকরেন।


1

সি এবং সি ++ এর মতো উচ্চ স্তরের ভাষাগুলিতে, এটি জাবার চেয়ে কম সমস্যা।

প্রথমত, সি এবং সি ++ কম্পাইল-টাইম স্ট্রিং সংক্ষেপণ সংজ্ঞায়িত করে, আপনি যেমন কিছু করতে পারেন:

std::cout << "Good morning everyone. I am here today to present you with a very, "
    "very lengthy sentence in order to prove a point about how it looks strange "
    "amongst other code.";

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

যদিও এটি সংকলক এবং বাস্তবায়নে কিছুটা অতিরিক্ত জটিলতার ব্যয়ে, সি এবং সি ++ প্রোগ্রামার থেকে দক্ষতার সাথে আউটপুট উত্পাদন করার জটিলতাটি আড়াল করতে আরও কিছু করে। জাভা অনেকটা অ্যাসেম্বলি ভাষার মতো - প্রতিটি কলটি System.out.printlnকনসোলে ডেটা লেখার জন্য অন্তর্নিহিত অপারেটিংয়ের একটি কলকে সরাসরি আরও অনেক অনুবাদ করে। আপনি যদি দক্ষতা উন্নত করতে বাফারিং করতে চান তবে তা আলাদাভাবে সরবরাহ করতে হবে।

এর অর্থ হল, উদাহরণস্বরূপ, সি ++ এর মধ্যে পূর্ববর্তী উদাহরণটি পুনরায় লেখা, এরকম কিছুতে:

std::cout << "Good morning everyone. I am here today to present you with a very, ";
std::cout << "very lengthy sentence in order to prove a point about how it looks ";       
std::cout << "strange amongst other code.";

... সাধারণত 1 এর দক্ষতার উপর প্রায় কোনও প্রভাব নেই। প্রতিটি ব্যবহারের জন্য coutকেবল একটি বাফারে ডেটা জমা করা হবে। বাফারটি পূরণ করার সময় বাফারটি অন্তর্নিহিত স্ট্রিমে ফ্লাশ করা হবে বা কোডটি ব্যবহার (যেমন সহ std::cin) থেকে ইনপুট পড়ার চেষ্টা করেছিল ।

iostreams এর একটি sync_with_stdioবৈশিষ্ট্যও রয়েছে যা নির্ধারণ করে যে iostreams থেকে আউটপুট সি-স্টাইল ইনপুট (যেমন, getchar) এর সাথে সিঙ্ক্রোনাইজ করা হয়েছে । ডিফল্টরূপে sync_with_stdioসত্যে সেট করা থাকে, সুতরাং, উদাহরণস্বরূপ, আপনি যদি লেখেন std::cout, তারপরে পড়ুন getchar, আপনি যে ডেটা লিখেছিলেন তা কল করার পরে coutফ্লাশ হয়ে যাবে getcharsync_with_stdioএটি অক্ষম করতে আপনি মিথ্যাতে সেট করতে পারেন (সাধারণত পারফরম্যান্সের উন্নতির জন্য করা হয়)।

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

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

সারাংশ

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


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


13
" সি এবং সি ++ এর মতো উচ্চ স্তরের ভাষাগুলিতে জাভা তুলনায় এটি কোনও সমস্যা কম less " - কী? সি এবং সি ++ জাভা থেকে নিম্ন স্তরের ভাষা। এছাড়াও, আপনি আপনার লাইন টার্মিনেটরগুলি ভুলে গেছেন।
ব্যবহারকারী 2357112

1
আমি পুরো জাভা নিম্ন স্তরের ভাষা হওয়ার উদ্দেশ্য ভিত্তিতে ইঙ্গিত করছি। আপনি কোন লাইন টার্মিনেটরগুলির বিষয়ে কথা বলছেন তা নিশ্চিত নয়।
জেরি কফিন 4

2
জাভা কম্পাইল-টাইম কনকনেটেশনও করে। উদাহরণস্বরূপ, "2^31 - 1 = " + Integer.MAX_VALUEএকটি একক ইন্টার্নযুক্ত স্ট্রিং (জেএলএস সেক 3.10.5 এবং 15.28 ) হিসাবে সঞ্চিত ।
200_সাক্সেস

2
@ 200_success: সংকলনের সময় জাভাটি স্ট্রিং কনটেন্টেশনটি নেমে এসে মনে হচ্ছে 1515 ডলারে নেমে এসেছে: "স্ট্রিং অবজেক্টটি নতুনভাবে তৈরি হয়েছে (§12.5) যতক্ষণ না এক্সপ্রেশন একটি সংকলন-সময় ধ্রুবক অভিব্যক্তি (.215.28) হয়।" এটি অনুমতি দেয় বলে মনে হয় তবে সংকলনের সময় কনকেন্টেশন করা দরকার হয় না। উদাহরণস্বরূপ, ইনপুটগুলি সংকলন-সময় ধ্রুবকগুলি না হলে ফলাফলটি নতুনভাবে তৈরি করতে হবে, তবে সময়কালের ধ্রুবকগুলি সংকলন করলে উভয় দিকেই কোনও প্রয়োজন হয় না। সংকলন-সময় কনকনেটেশন প্রয়োজন, আপনি এটি পড়তে হবে (অন্তর্নিহিত) "যদি" সত্যিকারের অর্থ "যদি হয় এবং কেবল যদি"।
জেরি কফিন

2
@ ফোশি: রিসোর্স দিয়ে চেষ্টা করাও অস্পষ্টভাবে আরআইআইয়ের মতো নয়। RAII ক্লাসটিকে রিসোর্সগুলি পরিচালনা করার অনুমতি দেয়, তবে সংস্থানসমূহের সাথে চেষ্টা করার জন্য সংস্থানগুলি পরিচালনা করতে ক্লায়েন্ট কোড প্রয়োজন। একের বৈশিষ্ট্যগুলি (বিমূর্ততা, আরও সঠিকভাবে) এবং অন্যটির অভাব সম্পূর্ণরূপে প্রাসঙ্গিক - আসলে, এগুলিই হ'ল এক ভাষাটিকে অন্য ভাষার চেয়ে উচ্চতর স্তর করে তোলে।
জেরি কফিন

1

যদিও পারফরম্যান্সটি এখানে সত্যই সমস্যা নয়, একগুচ্ছ printlnবিবৃতিগুলির খারাপ পাঠযোগ্যতা একটি অদৃশ্য ডিজাইনের দিক নির্দেশ করে।

আমরা কেন অনেক printlnবক্তব্যের ক্রম লিখি ? এটি যদি --helpকনসোল কমান্ডের পাঠ্যের মতো কেবল একটি স্থির পাঠ্য ব্লক হত তবে এটিকে পৃথক রিসোর্স হিসাবে রাখা এবং এটি পড়তে এবং অনুরোধে স্ক্রিনে লেখার চেয়ে আরও ভাল।

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

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

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