سه‌شنبه، اردیبهشت ۱۸، ۱۳۸۶

یک الگوی مناسب برای برنامه‌های console

برای ساده شدن بحث، فرض کنید می‌خواهیم برنامه‌ای بنویسیم که جملاتی را دریافت، و حروف کوچک آن را بزرگ کند. گرچه این برنامه بسیار ابتدایی است اما برای بحث ما مناسب است. یک شیوه طراحی چنین برنامه‌ای این است که، یک آرگومان برای نام فایل ورودی درنظر بگیریم و یک آرگومان نیز برای فایل خروجی. سپس برنامه آرگومان‌ها را بررسی و کار خود را انجام دهد. اگر آرگومان‌ها پاس نشدند، یا اشتباه پاس شدند برنامه پیغام خطا خواهد داد و اجرا متوقف می‌شود. بد نیست!

اما شیوه خوب طراحی (که شاید به نظر بسیار بد بیاید)، این است که برنامه ورودی‌هایش را از stdin بخواند، خروجیش را در stdout چاپ کند، و خطاهای احتمالی را در stderr. روش خواندن از stdin هم به گونه‌ای باشد که هرگاه به EOF رسید متوقف شود. نیازی هم به پشتیبانی از فایل نیست! اما اگر باشد چه بهتر. مثال ساده زیر، همین کار را می‌کند. فرض کنید نام فایل اجرایی my2upr[.exe] باشد.

my2upr.cpp
  01:   #include <iostream>
  02:   #include <string>
  03:   using namespace std;
  04:   
  05:   int main()
  06:   {
  07:       char szBuffer[1024];
  08:       while(cin.getline(szBuffer, 1024))
  09:       {
  10:           cout << strupr(szBuffer) << endl;
  11:       }
  12:   
  13:       return 0;
  14:   }

خط ۸ موجب خواندن خط به خط از ورودی تا زمان مشاهده EOF می‌شود. هنگام اجرای برنامه برای ایجاد EOF در Windows از Ctrl+Z و در UNIX از Ctrl+D استفاده کنید. خوب تا این‌جا ممکن است این روش، در مقایسه با روش آرگومانی، به نظر افتضاح بیاید. اما:

 

خواندن یک فایل و مشاهده آن در خروجی:

./my2upr < input.txt 

خواندن یک فایل و ذخیره خروجی در فایلی دیگر:

./my2upr < input.txt > output.txt

مشاهده محتویات یک فایل به حروف بزرگ:

cat readme.txt | ./my2upr | less

توضیح این که، < موجب می‌شود محتویات یک فایل به عنوان ورودی برنامه (یعنی به جای stdin) قرار گیرد. > خروجی برنامه (یعنی stdout) را به یک فایل منتقل می‌کند. پایپ نیز نتیجه اجرای برنامه قبل خود را به عنوان ورودی برنامه بعد خود قرار می‌دهد.

 

خلاصه این که، استفاده از این روش، قابلیت‌های اسکریپتی بسیار زیادی به برنامه می‌بخشد. بسیاری از دستورات UNIX به همین شیوه طراحی شده‌اند.


0 نظر:

ارسال یک نظر

جهت نمایش صحیح آدرس سایتتان، حتما قبل از آدرس //:http را درج کنید.