دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

مشاهده این پیام به این معنی است که شما در سایت عضو نیستید، لطفا در صورت تمایل جهت عضویت در سایت علمی نخبگان جوان اینجا کلیک کنید.

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
نمایش نتایج: از شماره 1 تا 2 , از مجموع 2

موضوع: تونلي به دنياي قديم

  1. #1
    کـــــــاربر فــــعال
    رشته تحصیلی
    کامپیوتر(مهندسی نرم افزار)
    نوشته ها
    18,304
    ارسال تشکر
    4,182
    دریافت تشکر: 19,008
    قدرت امتیاز دهی
    220
    Array

    پیش فرض تونلي به دنياي قديم

    ايجاد رابط کاربري خط فرمان در برنامه‌هاي شي‌گرا

    دريافت دستورات در برنامه‌هاي مختلف، به‌شيوه‌هاي مختلف انجام مي‌پذيرد. ممکن است از طريق صفحه نمايش چند لمسي دستورات به برنامه وارد شود، ممکن است از طريق ماوس، و يا حتي ممکن است با تايپ دستورات، بخواهيم برنامه را کنترل کنيم.
    کنترل برنامه‌ها با تايپ دستورات، زماني به‌کار مي‌آيد که دسترسي مستقيم يا دسترسي گرافيکي به برنامه نداريم و يا بايد از طريق کنسول با برنامه خود ارتباط برقرار کنيم و پاسخ را دريافت کنيم. در اين حالت، قابليت اجرا از طريق خط فرمان يک مزيت براي برنامه‌مان به‌حساب خواهد آمد.
    در اين مقاله قصد نداريم به‌سراغ دستورات پيچيده برويم و تلاش بر اين است که با مفاهيم شي‌گراي فعلي، يک پارسر براي خط فرمان بنويسيم. با بسط و گسترش همين کدها مي‌توان هر برنامه‌اي را به موتور تشخيص دستور از راه خط فرمان مجهز کرد.
    نخست آن‌که وجه شباهت تمامي دستورات با همديگر، اين است که همه‌شان داراي پارامترهاي ورودي هستند و همه آنها بايد به‌شيوه‌اي صحيح اجرا شوند. به‌عبارت ديگر وقتي دستوري وارد مي‌شود، بايد تشخيص داده شده، اجرا شده، و در صورت عدم شناسايي دستور، پيغام خطا ارسال کند. قدم نخست براي راه‌اندازي يک خط فرمان، توليد کلاسي پايه به‌صورت زير است:‌



    class baseCommand {

    public :

    baseCommand(int argc,char** argv);

    baseCommand();

    virtual void execute();

    virtual bool contain(const char* arg);

    virtual void printHelp();

    private :

    int argc;

    char** argv;
    }
    اين کلاس چيست و چه کاري قرار است انجام دهد؟
    اين کلاس تمامي متدها و فيلدهاي مورد نياز براي اجرا و نگهداري هر دستور را در خود دارد، و به‌عبارت بهتر يک شي‌ از يک دستور است. بقيه دستورات از اين کلاس ارث بري مي‌کنند و مستلزم بازنويسي متدهايي هستند که به‌صورت مجازي (Virtual) تعريف شده‌اند. اين کلاس دو فيلد با دسترسي خصوصي (Private) دارد. دليل اين امر اين است که اشيا ديگر نيازي به دانستن مقدار آنها و ديدن آنها از يک شي ديگر ندارند و در واقع اين در اين فيلدها مشخص مي‌شود که چه دستوري چگونه بايد اجرا بشود. فيلد اول argc تعداد آرگومان‌هاي ورودي هر دستور را مشخص مي‌کند و فيلد argv يک آرايه دو بعدي از کاراکترها (آرايه‌اي از رشته‌ها) است، که شامل دستور و پارامترهاي ورودي آن دستور است.
    اين کلاس دو سازنده دارد که يکي از آنها مقدارهاي argc و argv را از ورودي مي‌گيرد و ديگري هيچ آرگوماني را نمي پذيرد و از آن به سازنده پيش فرض (Default Constructor) ياد مي‌شود. متد execute دستور را اجرا مي‌کند و وظيفه آن مديريت اجراي صحيح دستور است. و متد ديگر printHelp است، اين متد زماني اجرا مي‌شود که دستور با پارامتر /? اجرا شود و هدف آن نشان دادن اطلاعاتي در مورد دستور است. متد ديگر contain است اين متد بررسي مي‌کند آيا پارامتر خاصي در argv موجود است يا خير.
    بسيار خب، حالا به يک فرمت کلي دست پيدا کرديم و مي‌دانيم براي پياده‌سازي هر دستور به چه چيزهايي نياز است و هر دستور بايد از چه الگويي بايد پيروي کند. حالا مي‌توان به‌شيوه‌اي ديگري به هر دستور نگاه کرد تا پياده‌سازي راحت‌تري داشته باشد. هر دستور يکسري پارامتر را به عنوان ورودي دريافت مي‌کند. خوب هر پارامتر براي انجام عمل خاصي است، پس در کلاس‌هاي مربوط به هر دستور علاوه بر دستورات فوق بايد متدهايي براي انجام هر عمل نوشته شود. به‌طور مثال دستور Copy، اين دستور بايد دو پارامتر را به‌صورت پيش‌فرض دريافت کند. اولين پارامتر فايل منبع و دومي فايل مقصد را مشخص مي‌کند حال اگر دستور copy با فرمان /x اجرا شود بايد فايل منبع به مقصد منتقل شود و کپي گرفته نشود. بنابراين، دو متد به نام‌هاي CopyFile و MoveFile را بايد در کلاس مربوط به دستور copy بنويسيم که عمليات مربوطه را انجام دهند.
    مشکلي که در اين ميان ممکن است رخ بدهد، اين است که متدهاي MoveFile و CopyFile‌را بايد به‌چه صورتي تبديل کنيم که امنيت کافي داشته باشد؟ آيا اين متدها private باشند يا public؟ از آنجا که اين متدها براي کلاس مربوط به دستور copy هستند پس بايد به‌صورت private تعريف شوند. اما اگر طور ديگري به اين دو متد نگاه کنيم، و اگر دستور ديگري داشتيم که نياز به کپي و کات کردن فايل‌ها داشت نتيجه چه مي‌شد؟ بايد اين متدها هر بار نوشته شوند؟ يا اينکه آنها را بصورت عمومي تعريف کنيم؟
    اگر به‌صورت عمومي تعريف کنيم، طراحي ما غلط است چون ديگر کلاس‌ها نبايد متدهايي که براي اجراي پارامترهاي ورودي هر دستور هستند را ببينند، راه حل چيست؟مي‌توانيم با نوشتن يک کلاس جداگانه براي کارکردن با فايل‌ها، اين مشکل را حل کنيم. اين کار دو مزيت دارد:
    1- متدهاي CopyFile و MoveFile از سطح کلاس دستورها جدا خوهد شد و بطور مستقل کار مي‌کنند. اين کار debug (اشکال زدايي) برنامه را راحت‌تر و نگهداري کد را ساده‌تر مي‌کند.
    در ضمن طراحي يکپارچه‌اي خواهيم داشت، بدين ترتيب کلاس File را براي کار با فايل‌ها را به‌صورت زير مي‌نويسيم:



    class File{

    const static int BUF_SIZE = 4096;

    public:

    static void Copy(char* source,char* destination);

    static void Move(char* source,char* destination);

    static void Delete(char* filename);

    static void Rename(char* oldname,char* newname);

    static bool Exist(char* filename);

    static void Create(char* filename,bool overwrite);

    }; نيازي به توضيح در مورد متدهاي کلاس نيست، بسيار خوب پس پياده‌سازي متد execute از کلاس مربوط به دستور copy به صورت زير خواهد شد:


    void execute(){

    if(this-»contain("/X") || this-»contain("/x")){

    File::Move(this-»argv[1],this-»argv[2]);

    }

    else

    File::Copy(this-»argv[1],this-»argv[2]);

    }
    حالا که موفق شديم کلاس مربوط به Copy را پياده کنيم، به بررسي کلاس ديگري مي پردازيم. اين کلاس براي ايجاد رابطه با کاربر مورد استفاده قرار مي‌گيرد، نام اين کلاس را Helper مي‌گذاريم، اين کلاس قرار است دستوراتي را که کاربر وارد مي‌کند، اعتبارسنجي کند و با توجه به دستورات وارد شده، عمليات مناسب را اجرا ‌کند. اين کلاس بصورت زير تعريف شده است :


    class utility{

    public :

    utility(char* command);

    utility();

    void Run();

    private :

    char* command;

    char** argv;

    int argc;

    baseCommand* internaleCommand;

    void parse();

    void createCommand();

    };
    اين کلاس شامل 3 فيلد است يکي argv وديگري argc که قبلا درمورد آنها و کاربردشان صحبت کرده‌ايم. ديگري يک شي از baseCommand. همانطور که گفتيم کلاس baseCommand کلاس پدر همه کلاس‌هاي مربوط به دستورات است و مقدار آن مي‌تواند تمامي دستورات را قبول کند، متد Run اين کلاس در واقع دستوري که کاربر وارد کرده است، را تجزيه و تحليل مي‌کند و فرمان مربوطه را اجرا مي‌کند. در اين متد ابتدا عبارت وارد شده توسط متد parse تجزيه و تحليل مي‌شود و فيلدهاي argv و argc مقدار دهي مي‌شوند، و سپس متد createCommand اجرا مي‌شود و بر اساس مقدار argv فيلد internalCommand مقدار دهي مي‌شود و سپس متدexecute از کلاس baseComman اجرا مي‌شود. با اين کار دستور مورد نظر انجام شده و خروجي‌ها چاپ مي‌شود، تا اينجا ما موفق شديم دستوري را وارد و آن را اجرا کنيم. حال بگذاريد شرايطي را بررسي کنيم که ما بخواهيم دستورات را پست سر هم وارد كنيم و اينکار تا آنجا ادامه پيدا کند که کاربر دستور exit را وارد کند و از برنامه خارج شود (يعني يک محيط خط فرمان براي کاربر ايجاد کنيم)، وظيفه اين کار بر عهده متد main يا متد اجرايي برنامه است که به اين صورت پياده سازي شده است:

    با اين پياده‌سازي، يک محيط خوب براي برنامه خود داريد که مي‌توانيد در آن دستورات مختلف را پياده کنيد. در اين مقاله، دستورات اجرايي، همان دستورات سيستم عامل ويندوز بود. آيا مي‌توانيد توابع و کلاس‌هاي داخلي سيستم خود را با استفاده از اين روش، راه‌اندازي و اجرا کنيد. موفق باشيد.
    امير بهاالدين سبط الشيخ
    ضميمه كليك روزنامه جام جم شماره‌ي 258
    شنبه : یارب العالمین 1شنبه : یا ذاالجلال والاکرام
    2شنبه : یا قاضی الحاجات 3شنبه : یاارحم الراحمین
    4شنبه : یا حی یاقیوم 5شنبه : لا اله الا الله الملک الحق المبین
    جمعه : اللهم صل علی محمد وال محمد وعجل فرجهم

  2. کاربرانی که از پست مفید آبجی سپاس کرده اند.


  3. #2
    دوست آشنا
    نوشته ها
    796
    ارسال تشکر
    241
    دریافت تشکر: 979
    قدرت امتیاز دهی
    36
    Array

    پیش فرض پاسخ : تونلي به دنياي قديم

    خب آبجی جان می نوشتی این ماله Visual C یا #C یا ... ؟؟

    کاربر بودن خوبه تا مدیر بودن
    سایت من : APCENTER.IR

اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. خبر: دنياي مجازي در تسخير مورچگان ديجيتال
    توسط A.L.I در انجمن سایر اخبار کامپیوتر
    پاسخ ها: 0
    آخرين نوشته: 17th November 2009, 04:47 PM
  2. دستگاه گوارش و طب قديم
    توسط Mina_Mehr در انجمن بیماریهای دستگاه گوارش
    پاسخ ها: 0
    آخرين نوشته: 6th July 2009, 10:19 PM
  3. پاسخ ها: 0
    آخرين نوشته: 7th May 2009, 04:19 PM
  4. پاسخ ها: 0
    آخرين نوشته: 10th December 2008, 11:09 AM
  5. مقاله: پيش بيني 10 اتفاق بزرگ در دنياي آي تي
    توسط diamonds55 در انجمن بخش مقالات وب و اینترنت
    پاسخ ها: 0
    آخرين نوشته: 21st October 2008, 10:18 PM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •