In NancyFX Succinctly, you'll learn what NancyFX is all about, where it came from, and what it can do for you as a .NET developer. Author Peter Shaw will explain why NancyFX is more than just another web framework, and teach you some of the many tricks that make it as easy as possible for you to create stunning web-enabled applications on the .NET platform.
کتابخانه Sortable
Sortable is a JavaScript library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery. Supports Meteor, AngularJS, React, Polymer, Knockout and any CSS library, e.g. Bootstrap. Demo
جهت افزودن قابلیتهای meta-programming به زبانهای جاوا اسکریپت و TypeScript و همچنین تعریف annotations بر روی کلاسها و اعضای کلاس، میتوان از Decorators استفاده کرد. یک decorator، تعریف ویژهای است که میتواند به تعریف یک کلاس، متد، خاصیت و یا پارامتر «متصل» شود و به صورت expression@ تعریف میگردد. این expression باید قابلیت فراخوانی به صورت یک متد را داشته باشد که در زمان اجرا فراخوانی خواهد شد. از Decorators در طراحی AngularJS 2 زیاد استفاده شدهاست.
نحوهی فعال سازی Decorators با ES 5
این قابلیت فعلا در مرحلهی آزمایش به سر میبرد؛ بنابراین برای فعال سازی آن نیاز است پارامترهای experimentalDecorators و emitDecoratorMetadata را به کامپایلر خط فرمان tsc و یا به خواص کامپایلر در فایل tsconfig.json اضافه کنید:
Command Line: tsc --target ES5 --experimentalDecorators --emitDecoratorMetadata tsconfig.json: { "compilerOptions": { "target": "ES5", "experimentalDecorators": true, "emitDecoratorMetadata": true } }
بررسی انواع Decorators
در اینجا یک مثال ساده از decoratorها را مشاهده میکنید:
// A simple decorator @decoratorExpression class MyClass { }
function decoratorExpression(target) { // Add a property on target target.annotated = true; }
در ادامه انواع و اقسام decoratorهای ممکن را با مثالهایی بررسی خواهیم کرد.
Class Decorator
یک class Decorator، پیش از تعریف یک کلاس اضافه میشود و هدف آن، اعمال تعاریفی به سازندهی کلاس است و از آن میتوان جهت تحت نظر قرار دادن تعاریف کلاس و یا تغییر یا حتی تعویض کلی تعاریف آن استفاده کرد. یک class Decorator را نمیتوان در سایر فایلهای تعاریف، مانند d.ts. قرار داد.
تنها آرگومانی که به یک class Decorator ارسال میشود، سازندهی کلاسی است که به آن اعمال شدهاست. اگر متد class Decorator مقداری را برگرداند، سبب تعویض و جایگزینی تعاریف کلاس با مقدار باگشت داده شده، میشود.
در ادامه دو مثال را از class Decoratorها مشاهده میکنید:
مثال بدون پارامتر
function ClassDecorator( target: Function // The class the decorator is declared on ) { console.log("ClassDecorator called on: ", target); } @ClassDecorator class ClassDecoratorExample { }
اگر به تصویر فوق و خروجی نهایی آن دقت کنید، مشاهده میکنید که یک decorator برای اجرا، نیازی به وهله سازی از آن کلاس ندارد و اجرای آن دقیقا در زمان تعریف کلاس انجام میشود. این اجرا به معنای تزریق کدهای تزئین کننده، به تعاریف سازندهی کلاس تعریف شده، پیش از وهله سازی از آن است.
مثال با پارامتر
function ClassDecoratorParams(param1: number, param2: string) { return function( target: Function // The class the decorator is declared on ) { console.log("ClassDecoratorParams(" + param1 + ", '" + param2 + "') called on: ", target); } } @ClassDecoratorParams(1, "a") @ClassDecoratorParams(2, "b") class ClassDecoratorParamsExample { }
ClassDecoratorParams(2, 'b') called on: function ClassDecoratorParamsExample() { } ClassDecoratorParams(1, 'a') called on: function ClassDecoratorParamsExample() { }
Property Decorator
یک Property Decorator دقیقا پیش از تعریف یک خاصیت اضافه میشود و نباید در سایر فایلهای تعاریف جانبی قرار گیرد. زمانیکه متد expression آن در runtime فراخوانی میشود، دو پارامتر را دریافت خواهد کرد:
الف) برای static member ها، متد سازندهی کلاس و برای instance memberها، prototype کلاس را دریافت میکند.
ب) نام عضو.
اگر متد expression تعریف شده، مقداری را برگرداند، به عنوان Property Descriptor آن عضو بکارگرفته میشود.
در مثال ذیل که متد PropertyDecorator به خاصیت name اعمال شدهاست، دو پارامتر ارسالی به آنرا بهتر میتوان مشاهده کرد:
function PropertyDecorator( target: Object, // The prototype of the class propertyKey: string | symbol // The name of the property ) { console.log("PropertyDecorator called on: ", target, propertyKey); } class PropertyDecoratorExample { @PropertyDecorator name: string; }
PropertyDecorator called on: PropertyDecoratorExample {} name
Method Decorator
یک Method Decorator باید درست پیش از تعریف یک متد، قرارگیرد و نباید در سایر کلاسها تعاریف نوعهای جانبی افزوده شود. هدف از آن میتواند بررسی، مشاهده و تغییر رفتار یک متد باشد. به متد expression آن، سه پارامتر ارسال میشوند:
الف) برای static member ها، متد سازندهی کلاس و برای instance memberها، prototype کلاس را دریافت میکند.
ب) نام عضو
ج) Property Descriptor عضو
اگر متد تعریف شده، خروجی را برگرداند به عنوان Property Descriptor آن متد استفاده خواهد شد.
در مثال ذیل، متد تزئین کنندهای به نام MethodDecorator تعریف شدهاست که سه پارامتر یاد شده را در زمان اجرا دریافت میکند:
function MethodDecorator( target: Object, // The prototype of the class propertyKey: string, // The name of the method descriptor: TypedPropertyDescriptor<any> ) { console.log("MethodDecorator called on: ", target, propertyKey, descriptor); } class MethodDecoratorExample { @MethodDecorator method() { } }
MethodDecorator called on: MethodDecoratorExample { method: [Function] } method { value: [Function], writable: true, enumerable: true, configurable: true }
و مثالی جهت محدود ساختن آن به یک سری متد خاص که یک پارامتر عددی را دریافت میکنند و یک خروجی عددی نیز دارند:
function TypeRestrictedMethodDecorator( target: Object, // The prototype of the class propertyKey: string, // The name of the method descriptor: TypedPropertyDescriptor<(num: number) => number> ) { console.log("TypeRestrictedMethodDecorator called on: ", target, propertyKey, descriptor); } class TypeRestrictedMethodDecoratorExample { @TypeRestrictedMethodDecorator method(num: number): number { return 0; } }
TypeRestrictedMethodDecorator called on: TypeRestrictedMethodDecoratorExample { method: [Function] } method { value: [Function], writable: true, enumerable: true, configurable: true }
و مثالی از تزئین کنندههای متدهای استاتیک یک کلاس که در این حالت، پارامتر target از نوع متد سازندهی کلاس خواهد بود و نه prototype آن:
function StaticMethodDecorator( target: Function, // the function itself and not the prototype propertyKey: string | symbol, // The name of the static method descriptor: TypedPropertyDescriptor<any> ) { console.log("StaticMethodDecorator called on: ", target, propertyKey, descriptor); } class StaticMethodDecoratorExample { @StaticMethodDecorator static staticMethod() { } }
StaticMethodDecorator called on: function StaticMethodDecoratorExample() { } staticMethod { value: [Function], writable: true, enumerable: true, configurable: true }
Parameter Decorator
یک Parameter Decorator باید درست پیش از تعریف یک آرگومان متد، قرارگیرد و نباید در سایر کلاسها تعاریف نوعهای جانبی افزوده شود. به متد expression آن سه پارامتر ارسال میشوند:
الف) برای static member ها، متد سازندهی کلاس و برای instance memberها، prototype کلاس را دریافت میکند.
ب) نام عضو
ج) شماره ایندکس پارامتر مدنظر در متد
از خروجی متد تزئین کننده در اینجا صرفنظر میشود.
در ادامه مثالی را از نحوهی تعریف یک تزئین کنندهی پارامترها را با سه آرگومان ویژهی آن، مشاهده میکنید:
function ParameterDecorator( target: Function, // The prototype of the class propertyKey: string | symbol, // The name of the method parameterIndex: number // The index of parameter in the list of the function's parameters ) { console.log("ParameterDecorator called on: ", target, propertyKey, parameterIndex); } class ParameterDecoratorExample { method(@ParameterDecorator param1: string, @ParameterDecorator param2: number) { } }
ParameterDecorator called on: ParameterDecoratorExample { method: [Function] } method 1 ParameterDecorator called on: ParameterDecoratorExample { method: [Function] } method 0
یک سری مثال تکمیلی
در پروژههای ویندوزی یکی از بیشترین ابزار کاربردی گریدویو تلریک Telerik
GridView میباشد و اینکه تمامی امکانات گرید مانند گروه بندی ، فیلترینگ و
... همه فارسی باشند خیلی برای پروژه خوب است.
منم در یکی از پروژهها نیاز به فارسی کردن این ابزار پرکاربرد ویندوزی داشتم و توانستم این مورد
را حل کنم . نحوه فارسی کردن این ابزار به شرح ذیل میباشد:
1- یک پروژه جدید ویندوزی در visual studio ایجاد میکنیم
2- اضافه کردن یک radGridView به فرم و خاصیت Dock آن را به حالت Fill و خاصیت RightToLeft را Yes قرار میدهیم :
3- حال برای اینکه یک سری اطلاعاتی داخل این گرید نمایش بدهیم یک کلاس در همان فرم درست میکنیم مشابه کد ذیل :
public List<MyCustomData> GetData() { List<MyCustomData> myList = new List<MyCustomData>(); for (int i = 1; i < 11; i++) { myList.Add(new MyCustomData() { ID = i, Name = "Name Family " + i.ToString(), Age = 29 }); } return myList; } public class MyCustomData { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public bool Sex { get; set; } }
4 - حال برای اینکه این اطلاعات را در گرید نمایش دهیم کد زیر را در بخش Load_Form1 مینویسیم :
private void Form1_Load(object sender, EventArgs e) { radGridView1.DataSource = GetData(); }
6 - برای اینکه این موارد فارسی شوند نیاز به یک کلاس یا Provider داریم که این عمل ترجمه را انجام دهد که حتی در سایت خود تلریک در بخش مربوطه نیز ارائه شده است. بنده این کلاس را کپی کرده و تمامی ترجمههای آنها را نیز نوشتم ( اگر در ترجمه ایرادی بود به بزرگی خودتان بخشیده و تصحیح نمائید . ) که کد آن را در زیر میتوانید در اختیار داشته باشید:
class PersianRadGridLocalizationProvider : RadGridLocalizationProvider { public override string GetLocalizedString(string id) { switch (id) { case RadGridStringId.FilterFunctionBetween: return "بین"; //Between case RadGridStringId.FilterOperatorBetween: return "بین"; case RadGridStringId.FilterFunctionContains: return "حاوی"; case RadGridStringId.FilterOperatorContains: return "حاوی"; case RadGridStringId.FilterFunctionDoesNotContain: return "شامل نشود"; //Does not contain case RadGridStringId.FilterOperatorDoesNotContain: return "شامل نشود"; case RadGridStringId.FilterFunctionEndsWith: return "پایان پذیرد با"; //Ends with case RadGridStringId.FilterOperatorEndsWith: return "پایان پذیرد با"; case RadGridStringId.FilterFunctionEqualTo: return "برابر با"; //Equals case RadGridStringId.FilterOperatorEqualTo: return "برابر با"; case RadGridStringId.FilterFunctionGreaterThan: return "بزرگتر از"; //Greater than case RadGridStringId.FilterOperatorGreaterThan: return "بزرگتر از"; case RadGridStringId.FilterFunctionGreaterThanOrEqualTo: return "بزرگتر یا مساوی با"; //Greater than or equal to case RadGridStringId.FilterOperatorGreaterThanOrEqualTo: return "بزرگتر یا مساوی با"; case RadGridStringId.FilterFunctionIsEmpty: return "خالی باشد"; //Is empty case RadGridStringId.FilterOperatorIsEmpty: return "خالی باشد"; case RadGridStringId.FilterFunctionIsNull: return "تهی باشد"; //Is null case RadGridStringId.FilterOperatorIsNull: return "تهی باشد"; case RadGridStringId.FilterFunctionLessThan: return "کمتر از"; //Less than case RadGridStringId.FilterOperatorLessThan: return "کمتر از"; case RadGridStringId.FilterFunctionLessThanOrEqualTo: return "کمتر یا مساوی با"; //Less than or equal to case RadGridStringId.FilterOperatorLessThanOrEqualTo: return "کمتر یا مساوی با"; case RadGridStringId.FilterFunctionNoFilter: return "بدون شرط"; //No filter case RadGridStringId.FilterOperatorNoFilter: return "بدون شرط"; case RadGridStringId.FilterFunctionNotBetween: return "نباشد بین"; //Not between case RadGridStringId.FilterOperatorNotBetween: return "نباشد بین"; //Operator case RadGridStringId.FilterFunctionNotEqualTo: return "برابر نباشد با"; //Not equal to case RadGridStringId.FilterOperatorNotEqualTo: return "برابر نباشد با"; case RadGridStringId.FilterFunctionNotIsEmpty: return "خالی نباشد"; //Is not empty case RadGridStringId.FilterFunctionNotIsNull: return "خالی نباشد"; //Is not null case RadGridStringId.FilterFunctionStartsWith: return "شروع شود با"; //Starts with case RadGridStringId.FilterFunctionCustom: return "شرط دلخواه"; //Custom case RadGridStringId.CustomFilterMenuItem: return "شرط دلخواه منو"; //Custom case RadGridStringId.CustomFilterDialogCaption: return "انتخاب شرط دلخواه"; //RadGridView Custom Filter Dialog case RadGridStringId.CustomFilterDialogLabel: return ":نشان دادن سطرهایی که"; //Show rows where: case RadGridStringId.CustomFilterDialogRbAnd: return "و"; //And case RadGridStringId.CustomFilterDialogRbOr: return "یا"; //Or case RadGridStringId.CustomFilterDialogBtnOk: return "تایید"; //OK case RadGridStringId.CustomFilterDialogBtnCancel: return "انصراف"; //Cancel case RadGridStringId.AddNewRowString: return "برای افزودن سطر جدید اینجا کلیک کنید"; case RadGridStringId.ClearValueMenuItem: return "پاک کردن مقدار سلول"; case RadGridStringId.DeleteRowMenuItem: return "حذف سطر"; //Delete Row case RadGridStringId.SortAscendingMenuItem: return "مرتب سازی صعودی"; //Sort Ascending case RadGridStringId.SortDescendingMenuItem: return "مرتب سازی نزولی"; //Sort Descending case RadGridStringId.ClearSortingMenuItem: return "حذف مرتب سازی"; //Clear Sorting case RadGridStringId.ConditionalFormattingMenuItem: return "قالب بندی مشروط"; //Conditional Formatting case RadGridStringId.GroupByThisColumnMenuItem: return "گروهبندی بر حسب این ستون"; //Group by this column case RadGridStringId.UngroupThisColumn: return "حذف این ستون از گروهبندی "; //Ungroup this column case RadGridStringId.ColumnChooserMenuItem: return "انتخابگر ستون"; //Column Chooser case RadGridStringId.HideMenuItem: return "مخفی کردن ستون"; //Hide case RadGridStringId.UnpinMenuItem: return "حالت پیش فرض"; //Unpin case RadGridStringId.PinMenuItem: return "حالت ستون"; //Pin case RadGridStringId.PinAtLeftMenuItem: return "چسپیدن به سمت چپ"; case RadGridStringId.PinAtRightMenuItem: return "چسپیدن به سمت راست"; case RadGridStringId.PinAtTopMenuItem: return "چسپیدن به بالا"; case RadGridStringId.PinAtBottomMenuItem: return "چسپیدن به پایین"; case RadGridStringId.BestFitMenuItem: return "اندازه بهینه ستون"; //Best Fit case RadGridStringId.PasteMenuItem: return "چسپاندن"; //Paste case RadGridStringId.EditMenuItem: return "ویرایش"; //Edit case RadGridStringId.CopyMenuItem: return "کپی"; //Copy case RadGridStringId.ConditionalFormattingCaption: return "قالب بندی مشروط"; //Custom Formatting Condition Editor case RadGridStringId.ConditionalFormattingLblColumn: return "قالب بندی سلولهایی با شرط:"; //Column: case RadGridStringId.ConditionalFormattingLblName: return "نام شرط:"; //Name: case RadGridStringId.ConditionalFormattingLblType: return "مقدار سلول:"; //Type: case RadGridStringId.ConditionalFormattingLblValue1: return "مقدار اول:"; //Value 1: case RadGridStringId.ConditionalFormattingLblValue2: return "مقدار دوم:"; //Value 2: case RadGridStringId.ConditionalFormattingGrpConditions: return "شرایط"; //Conditions case RadGridStringId.ConditionalFormattingGrpProperties: return "مشخصات"; //Properties case RadGridStringId.ConditionalFormattingChkApplyToRow: return "اعمال این شرط به کل سطر"; //Apply to row case RadGridStringId.ConditionalFormattingBtnAdd: return "افزودن شرایط"; //Add case RadGridStringId.ConditionalFormattingBtnRemove: return "حذف شرایط انتخابی"; //Remove case RadGridStringId.ConditionalFormattingBtnOK: return "تایید"; //OK case RadGridStringId.ConditionalFormattingBtnCancel: return "انصراف"; //Cancel case RadGridStringId.ConditionalFormattingBtnApply: return "اعمال قالب بندی"; //Apply case RadGridStringId.ColumnChooserFormCaption: return "انتخاب ستون ها"; //Column Chooser case RadGridStringId.ColumnChooserFormMessage: return "برای حذف یکی از ستونها، آن ستون را به اینجا بکشید";//"Drag a column header from the grid here to remove it from the current view."; case RadGridStringId.CompositeFilterFormErrorCaption: return "خطا"; case RadGridStringId.ConditionalFormattingChooseOne: return "[یکی را انتخاب کنید]"; case RadGridStringId.ConditionalFormattingContains: return "[حاوی [مقدار اول"; case RadGridStringId.ConditionalFormattingDoesNotContain: return "حاوی [مقدار اول] نباشد"; case RadGridStringId.ConditionalFormattingEndsWith: return "با [مقدار اول] پایان یابد"; case RadGridStringId.ConditionalFormattingEqualsTo: return "[برابر با [مقدار اول"; case RadGridStringId.ConditionalFormattingIsBetween: return "بین [مقدار اول] و [مقدار دوم] باشد"; case RadGridStringId.ConditionalFormattingIsGreaterThan: return "[بزرگتر از [مقدار اول"; case RadGridStringId.ConditionalFormattingIsGreaterThanOrEqual: return "[بزرگتر یا مساوی با [مقدار اول"; case RadGridStringId.ConditionalFormattingIsLessThan: return "کوچکتر از [مقدار اول]"; case RadGridStringId.ConditionalFormattingIsLessThanOrEqual: return "کوچکتر یا مساوی با [مقدار اول]"; case RadGridStringId.ConditionalFormattingIsNotBetween: return "بین [مقدار اول] و [مقدار دوم] نباشد"; case RadGridStringId.ConditionalFormattingIsNotEqualTo: return "برابر با [مقدار اول] نباشد"; case RadGridStringId.ConditionalFormattingRuleAppliesOn: return "اعمال شرایط روی:"; case RadGridStringId.ConditionalFormattingStartsWith: return "با [مقدار اول] شروع میشود"; case RadGridStringId.CustomFilterDialogCheckBoxNot: return "با این شرایط نباشد"; case RadGridStringId.CustomFilterDialogFalse: return "False"; case RadGridStringId.CustomFilterDialogTrue: return "True"; case RadGridStringId.FilterCompositeNotOperator: return "نباشد"; case RadGridStringId.FilterLogicalOperatorAnd: return "و"; case RadGridStringId.FilterLogicalOperatorOr: return "یا"; case RadGridStringId.FilterMenuAvailableFilters: return "فیلتر شده"; case RadGridStringId.FilterMenuButtonCancel: return "انصراف"; case RadGridStringId.FilterMenuButtonOK: return "تایید"; case RadGridStringId.FilterMenuClearFilters: return "پاک کردن فیلتر"; case RadGridStringId.FilterMenuSearchBoxText: return "جستجو..."; case RadGridStringId.FilterMenuSelectionAll: return "همه"; //case RadGridStringId.FilterMenuSelectionAllSearched: return "نتیجه همه جستجو"; case RadGridStringId.FilterMenuSelectionNotNull: return "خالی نباشد"; case RadGridStringId.FilterMenuSelectionNull: return "خالی باشد"; case RadGridStringId.FilterOperatorCustom: return "دلخواه"; case RadGridStringId.FilterOperatorIsLike: return "مانند"; case RadGridStringId.FilterOperatorNotIsContainedIn: return "نباشد در"; case RadGridStringId.FilterOperatorNotIsEmpty: return "خالی نباشد"; case RadGridStringId.FilterOperatorNotIsLike: return "نباشد شبیه"; case RadGridStringId.FilterOperatorNotIsNull: return "خالی نباشد"; case RadGridStringId.FilterOperatorStartsWith: return "شروع شود با"; case RadGridStringId.GroupingPanelDefaultMessage: return "برای گروهبندی ستونها، ستونی را به اینجا بکشید"; case RadGridStringId.GroupingPanelHeader: return ":گروهبندی بر حسب"; case RadGridStringId.NoDataText: return "داده ای برای نمایش وجود ندارد"; case RadGridStringId.UnpinRowMenuItem: return "حالت پیش فرض"; default: return base.GetLocalizedString(id); } } }
7 - حال اگر برنامه را اجرا کنید باز موارد انگلیسی گرید تلریک فارسی نمیشوند و باید در کلاس Program.cs پروژه این یک خط کد را هم اضافه نمائید.
//using Telerik.WinControls.UI.Localization; RadGridLocalizationProvider.CurrentProvider = new PersianRadGridLocalizationProvider();
8 - حال اگر برنامه را اجرا نمایید تمامی موارد را فارسی مشاهده خواهید نمود ( شکل ذیل )
لطفا ما را از نظرات سازنده خود بی نصیب نفرمائید. با تشکر
- چرا به کامنت گذاری یا مستند نویسی نیاز داریم؟
- چگونه کامنت بنویسیم؟
- انواع کامنتها چیست؟
- چه کامنتهایی اشتباه هستند؟
همانطور که بیان کردیم، کامنت گذاری یکی از مهمترین کارهایی است که یک برنامه نویس انجام میدهد. به خصوص زمانیکه به صورت تیمی کار میکنید، این امر مهمتر از قبل خود را نشان میدهد. بسیاری از برنامه نویسان که بیشتر دلیل آن تنبلی است، از این کار سرباز میزنند و ممکن است آن را اتلاف وقت بدانند. ولی با کامنت گذاری فهم و درک کد، در آینده بالاتر میرود. در مقالهی تخصصی «هنر کامنت نویسی» نوشتهی «برنهارد اسپویدا» بهانههای جالبی از برنامه نویسان را برای سرباز زدن از اینکار، ذکر شده است؛ به عنوان نمونه:
من کدم را به خوبی متوجه میشوم.کد خوب، خودش گویای همه چیز هست.وقتی برای کامنت نویسی وجود ندارد. باید چسبید به کد.
- شاید امروز معنای یک کد را متوجه شوید، ولی آیا در آینده، مثلا یک سال بعد هم چنین خواهد بود؟
- آیا میتوانید هر سیستمی را که طراحی میکنید، به خاطر بسپارید که فعالیتهایش را به چه نحوی انجام میدهد؟
- اگر در یک کار تیمی باشید، شاید شما متوجه کدتان میشوید، ولی آیا تضمینی وجود دارد که دیگران هم متوجه روش شما شوند؟
- آیا کدی که شما بر روی آن فکر کردهاید و در ذهن خود روش انجام آن را ترسیم کردهاید، میتواند برای برنامه نویسی که کد شما را میبیند هم رخ دهد؟
- اگر شما به صورت تیمی کاری را انجام دهید و یکی از برنامه نویسهای شما از تیم جدا شود، چگونه میتوانید کار او را دنبال کنید؟
- اگر برای برنامه نویسی اتفاق یا حادثهای پیش بیاید که دسترسی شما به او ممکن نباشد چه؟
Documentary Comments: این مستند سازی در سطح یک سند مثل فایل یا به خصوص یک پروژه رخ میدهد که شامل اطلاعات و تاریخچهی آن سند است که این اطلاعات به شرح زیر هستند:
File Name | نام سند |
File Number/Version Number | شماره نسخه آن سند |
Creation Date | تاریخ ایجاد آن |
Last Modification Date | تاریخ آخرین تغییر سند |
Author's Name | سازندهی سند |
Copyright Notice | اطلاعاتی در مورد کپی رایت سند |
Purpose Of Program | هدف کاری برنامه. یک خلاصه از آن چه برنامه انجام میدهد. |
Change History | لیستی از تغییرات مهمی که در جریان ایجاد آن رخ داده است. |
Dependencies | وابستگیهای سند. بیشتر در سطح پروژه معنا پیدا میکند؛ مانند نمونهی آن برای سایت جاری که به صورت عمومی منتشر شده است. |
Special Hardware Requirements | سخت افزار مورد نیاز برای اجرای برنامه. حتی قسمتی میتواند شامل نیازمندیهای نرم افزاری هم باشد. |
PCMBOAT5.PAS************************************************************* ** File: PCMBOAT5.PAS Author: B. Spuida Date: 1.5.1999 Revision: 1.1 PCM-DAS08 and -16S/12 are supported. Sorting routine inserted. Set-files are read in and card as well as amplification factor are parsed. 1.1.1 Standard deviation is calculated. 1.1.2 Median is output. Modal value is output. 1.1.4 Sign in Set-file is evaluated. Individual values are no longer output. (For tests with raw data use PCMRAW.EXE) To do: outliers routine to be revised. Statistics routines need reworking. Existing Datafile is backed up. Purpose: Used for measurement of profiles using the Water-SP-probes using the amplifier andthe PCM-DAS08-card, values are acquired with n = 3000. Measurements are taken in 1 second intervals. The values are sorted using Quicksort and are stacked "raw" as well as after dismissing the highest and lowest 200 values as 'outliers'. Requirements: The Card must have an A/D-converter. Amplifier and probes must be connected. Analog Signal must be present. CB.CFG must be in the directory specified by the env-Variable "CBDIREC" or in present directory.
در بالا، خصوصیت کپی رایت حذف شده است. دلیل این امر این است که این برنامه برای استفاده در سطح داخلی یک شرکت استفاده میشود.
Functional Comments: کامنت نویسی در سطح کاربردی به این معنی نیست که شما اتفاقاتی را که در یک متد یا کلاس یا هر بخشی روی میدهد، خط به خط توضیح دهید؛ بلکه چرخهی کاری آن شی را هم توضیح بدهید کفایت میکند. این مورد میتواند شامل این موارد باشد:
- توضیحی در مورد باگهای این قسمت
- یادداشت گذاری برای دیگر افراد تیم
- احتمالاتی که برای بهبود ویژگیها و کارایی کد وجود دارد.
Explanatory Comment: کامنت گذاری توصیفی در سطح کدنویسی رخ میدهد و شامل توضیح در مورد کارکرد یک شیء و توضیح کدهای شیء مربوطه میگردد. برای قرار دادن کامنت الزامی نیست که کدها را خط به خط توضیح دهید یا اینکه خطوط ساده را هم تشریح کنید؛ بلکه کامنت شما همینقدر که بتواند نحوهی کارکرد هر چند خط کد مرتبط به هم را هم توضیح دهد، کافی است. این توضیحها بیشتر شامل موارد زیر میشوند:
- کدهای آغازین
- کدهای خروجی
- توضیح کوتاه از آنچه که این شیء ، متد یا ... انجام میدهد.
- حلقههای طولانی یا پیچیده
- کدهای منطقی عجیب و پیچیده
- Regular Expression
کدهای آغازین شروع خوبی برای تمرین خواهند بود. به عنوان نمونه اینکه توضیحی در مورد ورودی و خروجی یک متد بدهید که آرگومانهای ورودی چه چیزهایی هستند و چه کاربری داردند و در آغاز برنامه، برنامه چگونه آماده سازی و اجرا میشود. مقادیر پیش فرض چه چیزهایی هستند و پروژه چگونه تنظیم و مقداردهی میشود.
کدهای خروجی هم به همین منوال است. خروجیهای نرمال و غیرنرمال آن چیست؟ کدهای خطایی که ممکن است برگرداند و ... که باید به درستی توضیح داده شوند.
توضیح اشیاء و متدها و ... شامل مواردی چون: هدف از ایجاد آن، آرگومان هایی که به آن پاس میشوند و خروجی که میدهد و اینکه قالب یا فرمت آنها چگونه است و چه محدودیتهایی در مقادیر قابل انتظار وجود دارند. ذکر محدودیتها، مورد بسیاری مهمی است و دلیل بسیاری از باگها، عدم توجه یا اطلاع نداشتن از وجود این محدودیت هاست. مثلا محدودهی خاصی برای آرگومانهای ورودی وجود دارد؟ چه اتفاقی میافتد اگر به یک بافر 128 کاراکتری، 1024 کاراکتر را ارسال کنیم؟
کدهای منطقی عجیب، یکی از حیاتیترین بخشهای کامنت گذاری برای نگه داری یک برنامه در آینده است. به عنوان نمونه استفاده از عبارات با قاعده، اغلب اوقات باعث سردرگمی کاربران شده است. پس توضیح دادن در مورد این نوع کدها، توصیه زیادی میشود. اگر عبارات با قاعده شما طولانی هستند، سعی کنید از هم جدایشان کنید یا خطوط آن را بشکنید و هر خط آن را توضیح دهید.
هر زبانی از یک سیستم خاص برای کامنت گذاری استفاده میکند. به عنوان مثال پرل از سیستم (POD (Plain Old Documentation استفاده میکند یا برای Java سیستم JavaDoc یا برای PHP از سیستم PHPDoc (+ ) که پیاده سازی از JavaDoc میباشد استفاده میکنند. این سیستم برای سی شارپ استفاده از قالب XML است. کد زیر نمونهای از استفاده از این سیستم است:
// XMLsample.cs // compile with: /doc:XMLsample.xml using System; /// <summary> /// Class level summary documentation goes here.</summary> /// <remarks> /// Longer comments can be associated with a type or member /// through the remarks tag</remarks> public class SomeClass { /// <summary> /// Store for the name property</summary> private string myName = null; /// <summary> /// The class constructor. </summary> public SomeClass() { // TODO: Add Constructor Logic here } /// <summary> /// Name property </summary> /// <value> /// A value tag is used to describe the property value</value> public string Name { get { if (myName == null) { throw new Exception("Name is null"); } return myName; } } /// <summary> /// Description for SomeMethod.</summary> /// <param name="s"> Parameter description for s goes here</param> /// <seealso cref="String"> /// You can use the cref attribute on any tag to reference a type or member /// and the compiler will check that the reference exists. </seealso> public void SomeMethod(string s) { } }
دستورات سیستم کامنت گذاری سی شارپ
در سایت جاری، دو مقاله زیر اطلاعاتی در رابطه با نحوهی کامنت گذاری ارئه دادهاند.
- در مقاله «زیباتر کد بنویسیم» چند مورد آن به این موضوع اختصاص دارد.
- مقاله «وادار کردن خود به کامنت نوشتن» گزینهی کامنت گذاری اجباری در ویژوال استودیو را معرفی میکند.
5 آنتی ویروس رایگان برای ویندوز
Hackers are smart and users are not being able to cope with their pace of evolution. The result is malware outbreaks we get to know about frequently. Windows is the most widely used OS on Pcs. That makes it the most widely targeted OS too. What is an average user’s (by average I mean not too technical) defense in such case? The anti malware programs. Of course, you have to pay a decent price for your PC to be secured from latest malware derivatives, but what’s better than to get the security for no cost?