System.out.println () ব্যবহার করা এত খারাপ কেন? [বন্ধ]


18

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

কিছু দ্রুত পরীক্ষার জন্য System.out.println () ব্যবহার করা কি আসলেই খারাপ?


3
না, এটি দ্রুত পরীক্ষা, কে চিন্তা করে?
ব্রায়ান বোয়েচার

10
কে বলেছে এটা খারাপ? বিকল্প কি?
জেমস

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

1
ব্যবহার করার চেষ্টা করুন System.err.println()এবং দেখুন কি হয়। আমি সরঞ্জামটি অনুমান করছি যে আপনি System.outভুল উদ্দেশ্যে ব্যবহার করছেন thinks
ইজকাটা

2
প্রাথমিক সমস্যাটি স্কেলাবিলিটি এবং নিয়ন্ত্রণের সাথে। আপনার যদি লক্ষ লক্ষ এই বিবৃতি থাকে তবে কী কী দেখতে হবে তা আপনি কীভাবে দেখতে পাবেন। আপনার যদি এইগুলির একটির প্রতিক্রিয়া প্রয়োজন হয় তবে আপনি কীভাবে তা অগ্রগতিতে করতে পারেন। লগিং ফ্রেমওয়ার্কগুলি সাধারণত সেই দুটি চিন্তাই System.out এ প্রয়োগ হয়।

উত্তর:


18

মন্তব্যে প্রকাশিত হিসাবে, আসল প্রশ্নটি জিজ্ঞাসা করা হচ্ছে, স্ট্যাটিক কোড বিশ্লেষণ সরঞ্জামগুলি System.out.println এর পতাকা ব্যবহার করে কেন?

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

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


3
চমৎকার উত্তর. ধন্যবাদ .. "1 এর জন্য" আপনি যদি জিইআইআই অ্যাপ্লিকেশন কোডিং করে থাকেন তবে তথ্যটি ব্যবহারকারীর সামনে উপস্থাপন করা উচিত, যেখানে স্টাডআউটটি নির্দেশিত হবে না (যা সম্ভবত কোথাও নেই) "
কায়সার

10

সকল stdoutবাফার করা হয়, এবং এইভাবে এটি সম্ভব যে আপনার প্রোগ্রাম বিপর্যস্ত হবে পরে তোমাকে ডেকেছিলাম println()কিন্তু সামনে এটা পর্দা ছুঁয়েছে।

বলা হচ্ছে যে, এই দৃশ্য সত্যিই অসম্ভব। এগিয়ে যান এবং এটি ব্যবহার করুন, কিন্তু কেবল আপনার মনের পিছনে এই সামান্য সীমাবদ্ধতা রাখুন।


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

1
@ ডেলান, সম্ভবত, তবে কিছু ঘটতে পারে। (স্টাডাউটটি যে কোডটি প্রবাহিত করে সেদিকেই সমস্যা দেখা দিতে পারে The আপনি যে থ্রেডটি চালাচ্ছেন তা জোর করে বন্ধ করা যেতে পারে current ওএস দ্বারা মেমরি থেকে বর্তমান প্রক্রিয়াটি জোরপূর্বক ফেলে দেওয়া যেতে পারে)) আমার বক্তব্যকে ঘিরে আপনার জীবন যাপন করবেন না, তবে এটি সম্পর্কে সচেতন হতে হবে।
রিওয়ালক

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

2
আমি মনে করি না যে আমি এটি কখনও দেখেছি বা এটি ঘটতে শুনেছি, যদিও আমি অন্যান্য সমস্যাগুলি দেখেছি। এই সমস্যাটি লগারের মতো সরঞ্জামগুলির সাথে আরও ভাল হওয়ার সম্ভাবনা নেই কারণ তারা সম্ভবত অন্তর্নিহিত সরঞ্জাম হিসাবে System.out ব্যবহার করবে।
বিল কে

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

8

System.outশুধু একটি আবৃত করা হয় BufferedOutputStream। এটি সম্ভবত আপনি যে কোনও লগিং ফ্রেমওয়ার্ক ব্যবহার করবেন তার অনুরূপ, ফ্রেমওয়ার্কগুলি আপনার লগ আউটপুটটির কনফিগারেশন এবং গন্তব্য আকারে কেবল আরও কার্যকারিতা সরবরাহ করে


4
এটি আসলে প্রশ্নের উত্তর দেয় না। "এটা কি খারাপ?"
সার্গের্গ

@ বার্গ - কারণ প্রশ্নের অংশটি সম্পূর্ণ প্রাসঙ্গিক নির্ভর। (বা কেবল, না, এটি খারাপ নয়)
স্পিনিং_প্লেট

7

যদি আপনি একটি তুচ্ছ-তুচ্ছ প্রোগ্রামে এবং আপনি কাজ করে থাকেন তবে এটি খারাপ

  • স্বয়ংক্রিয় ইউনিট পরীক্ষার পরিবর্তে System.out কে ক্রাচ হিসাবে ব্যবহার করছে (JUnit)
  • সিস্টেম.আউটমেন্ট বিবৃতি তৈরি এবং মুছতে বা মন্তব্য করতে / প্রচুর সময় ব্যয় করুন

1
বেশিরভাগ আইডিই'র স্বতঃপরিমাণ সিস্টেম.আউট.প্রিন্টলনস, মন্তব্য / বিন্যাসকে একটি uncommenting এবং একটি লাইন মুছে ফেলার জন্য হটকি থাকতে হবে। এর অতিরিক্ত ব্যবহার এড়াতে চেষ্টা করার জন্য আপনি নীতিগতভাবে সঠিক, তবে আপনি অন্তত এভাবে সময় সাশ্রয় করতে পারেন।
স্টিভেন

7

System.outএমনকি থ্রোওয়ে কোডেও ব্যবহার সম্পর্কে কয়েকটি সতর্কতা রয়েছে ।

একটি বড় সমস্যা হ'ল এটি সাধারণত ধীর হয় । উদাহরণস্বরূপ, আপনি যদি কিছু কোডের গতি সম্পর্কে মোটামুটি ধারণা পাওয়ার চেষ্টা করছেন (নোট করুন যে মাইক্রোবেইনমার্কগুলি শক্ত ) তবে System.out.println()আপনার যে কোনও জায়গায় একটি যুক্ত করা সত্যিই আপনার সময়কে জবাবদিহি করতে পারে (কারণ এটি সিঙ্ক্রোনাইজ হচ্ছে এবং প্রায়শই আসল আউটপুটটির জন্য অপেক্ষা করে ফিরে আসার আগে ব্যবহারকারীর কাছে দৃশ্যমান হবে)।

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


পারফরম্যান্স একটি ভাল যুক্তি ..
কায়সার

4

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

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

আপনি যদি আবিষ্কার করেন যে আপনি প্রচুর লগিং করছেন println(), তবে আপনার কোডবেস আপনাকে বলার চেষ্টা করছে যে এটি ক্রমবর্ধমান ব্যথা অনুভব করছে। সেই সময়ে, সঠিক লগিংয়ে বিনিয়োগ করা এটি মূল্যবান worth


3

আমার প্রায়শই সমস্যা হয় যে সিস্টেম.আউট.প্রিন্টটি "সিস্টেম ডিফল্ট" কোডেপ ব্যবহার করে যা প্রায়শই লিনাক্সের আওতায় ইউটিএফ -8 থাকে, তবে কিছু উইন্ডোজের অধীনে এমএস স্টাফ ফেলা হয়।

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

আমি অতএব System.out এর চেয়ে বেশি কাস্টম প্রিন্ট রাইটার পছন্দ করি


এমএস স্টাফ ক্র্যাড দ্বারা। আপনার মানে সিপি 1352 বা ইউটিএফ 16?
কোল জনসন

@ কোলজাহনসন: উইন্ডোজ কনসোল উইন্ডো দুর্ভাগ্যক্রমে এখনও ইউটিএফ 16 প্রাক যুগে আটকে আছে। অন্তর্নির্মিত কনসোল সহ একটি বুদ্ধিমান আইডিই ব্যবহার করা তবে সেই সমস্যাটি হ্রাস করতে পারে।
জোচিম সৌর

@ কোল জনসন - আমি সিপি 65001 (অর্থাত্ utf8) এর সাথে বেঁচে থাকতে পারতাম, তবে এটি "সিস্টেম ডিফল্ট" কোডপেজ হিসাবে পাওয়ার কোনও উপায় নেই বলে মনে হয়, যখন উদাহরণস্বরূপ, আপনার কাছে একটি জার্মান কীবোর্ড রয়েছে সিপি 850 বা এরকম কিছু।
ইঙ্গো

1

এটি মোটেও খারাপ নয়। ধারণাটি সত্য যে এটি খুব সহজ এবং আপনার অ্যাপ্লিকেশনটিতে ডেডিকেটেড লগিং ফ্রেমওয়ার্ক ব্যবহার করার মতো অত্যাধুনিক নয় from

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


0

এটি ব্যবহারে কোনও ভুল নেই, এটি আপনাকে 'কী ঘটছে' তা নির্ধারণ করতে সহায়তা করে।

তবে যদি আপনার পিয়ার / অন্যান্য ডেভস / সরঞ্জামগুলি আপনাকে উপহাস করে, আপনি সর্বদা লগার ব্যবহার করতে পারেন , বা জুনিট পরীক্ষা শুরু করতে পারেন !


0

ঘটনামূলক সিস্টেম.আউট.প্রিন্টলনের সবচেয়ে বড় সমস্যাটি যেমনটি আমি দেখছি তা হ'ল এটি একটি "খারাপ অভ্যাসের ঘ্রাণ (টিএম)"। আপনি যদি নিজেকে এই কাজটি করতে দেখেন তবে আপনি সম্ভবত আপনার প্রিয় ডিবাগারটি ব্যবহার করে আরও স্বাচ্ছন্দ্য বোধ করে আপনার কার্যকারিতাটি উন্নত করতে পারেন।

একটি ডিবাগার সহ, আপনি নিশ্চিতভাবেই জানেন যে একটি ব্রেকপয়েন্ট আপনার প্রডাকশন কোডে স্খলিত হবে না, যখন একটি সিস্টেম.আউট.প্রিন্টলন হতে পারে।

সাইড নোটে, আপনি যদি কেবলমাত্র দ্রুত পরীক্ষা করে থাকেন এবং ডিবাগারটি না ব্যবহার করে চলতে থাকেন তবে আমার মনে হয় System.out.println একটি লগিং ফ্রেমওয়ার্ক ব্যবহার করার চেয়ে ভাল, যেহেতু আপনি যদি দুর্ঘটনাক্রমে একটি লগ.ডিগব্যাগের বিবৃতি ছেড়ে দেন তবে শেষ হয়ে গেছে, শিকড়কে কেটে ফেলা শক্ত।


0

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

এগুলি অপসারণ করতে ভুলে যাওয়ার বিপদটি সম্ভবত এটির বিরুদ্ধে পরামর্শ দেওয়া হয়েছে।


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