اين کلاس چيست و چه کاري قرار است انجام دهد؟
اين کلاس تمامي متدها و فيلدهاي مورد نياز براي اجرا و نگهداري هر دستور را در خود دارد، و بهعبارت بهتر يک شي از يک دستور است. بقيه دستورات از اين کلاس ارث بري ميکنند و مستلزم بازنويسي متدهايي هستند که بهصورت مجازي (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 را براي کار با فايلها را بهصورت زير مينويسيم: