یکشنبه , ۳۰ تیر ۱۳۹۸
خانه - محمد لطفی (صفحه 2)

محمد لطفی

برنامه نویس و توسعه دهنده .Net هستم. از یادگیری و آموزش لذت می برم. برنامه نویسی رو از دانشگاه شروع کردم و الانم در نیک آموز مهارت های خودم رو توسعه می دم.

سوال دوم – آیا می توانید از کدتان یک برنامه اجرایی بسازید؟

در مقاله قبلی با عنوان و مفهوم تست جوئل آشنا شدید. و سوال اول این تست نیز که استفاده از سورس کنترل بود را نیز توضیح دادیم. اکنون نوبت به سوال دوم می رسد.

 

سوال اول – آیا از سورس کنترل استفاده می کنید؟

در مقاله قبلی با عنوان و مفهوم تست جوئل آشنا شدید. در این مقاله  اولین سوال این تست را از شما می پرسیم.لطفا سورس کنترل هایی را که استفاده می کنید به ما معرفی کنید.

من هم از بسته های حرفه ای و تجاری سورس کنترل و هم از بسته ها و نرم افزار های رایگانی مثل CVS استفاده کردم، و باید به شما بگم که CVS برنامه خوبی بود. اما اگر شما از برنامه های سورس کنترل استفاده نمی کنید باید بگم شما فقط دارید بی خودی تلاش می کنید که اعضای تیمتان با همدیگر همکاری کنند. در حالی که برنامه نویسان اصلا نمی توانند بفهمند که سایر همکارانشان چه کار هایی را قبلا انجام داده و الان در حال انجام چه کاری هستند. اشتباهات را نمی توان پیگیری و حل و فصل کرد. و خیلی مشکلات دیگه. بهترین مزیت استفاده از سورس کنترل اینه که کد شما روی سیستم تمام افراد تیم ذخیره می شود و شما دیگر استرسی برای از دست دادن آنها ندارید. من تا کنون نشنیده م که کد های یک تیم که از سورس کنترل استفاده می کنند و از دست برود.

Joel Spolsky

 

سورس کنترل چیست؟

سورس کنترل عبارت است از سیستمی برای کنترل و پی‌گیری تغییرات در حین توسعه و نگه داری یک برنامهٔ نرم‌افزاری.

تغییرات می تواند شامل فایل‌های سورس، راهنماها، میک فایل‌ها، اشیاء نرم‌افزاری و …. سرس کنترل به خصوص در جایی اهمیت پیدا می‌کند که یک تیم که شامل چندین برنامه نویس است،بخواهند روی منابع مشترکی کار کنند. در این صورت است که مفاهیمی همانند مقایسه، ترکیب، تداخل و … پیش می‌آیند که سورس کنترل باید بتواند راه حل مناسبی برای هر یک ارایه دهد.

امروزه معمولاً از ابزارهای نرم‌افزاری برای این کار استفاده می‌شود. با این حال هنوز هم هستند شرکتهایی که از روش‌های قدیمی مانند داشتن یک فایل متن در هر پوشه، هارد کپی و … استفاده می‌کنند.و …

این نرم افزار علاوه براینکه این امکان را فراهم می کنند که شما به صورت گروهی روی یک سورس کار کنید از سورس شما محافظت می کند ؛ همیشه یک نسخه به روز از سورس در یک مکان امن قرار دارد ، تمامی تغییرات محفوظ می ماند ، حتی شما میتوانید قطعه کدی که سالها پیش نوشته اید را بازیابی نمایید و…

خیلی از ما تا کنون نام نرم افزار های Source Control را نشنیده ایم ، برخی شنیده ولی استفاده نکردایم بعضی دیگر هم بدون این نرم افزار ها حتی یک خط کد حاضر نیستیم بنویسیم !

نرم افزار های Source Control زیادی وجود دارد که برخی از آنها عبارتند از :

  • Microsoft Visual Source Safe
  • Rational Clear Case
  • Microsoft Team Fundation Server
  • CVS
  • Visual Source Hide
  • Subversion

 

منبع

با Joel Test تیم برنامه نویسی خود را ارزیابی کنید.

آیا تا به حال چیزی از SEMA شنیده اید؟ باید بدانید که این یک سیستم نسبتا دقیق برای اندازه گیری و ارزیابی  یک تیم نرم افزاری است. نه صبر کنید پیوند را دنبال نکنید، فقط شش سال طول خواهد کشید تا آن را درک کنید و … به همین دلیل من تست (هیچ مسئولیتی رو هم در قبالش بر عهده نمیگیرم) خودم  را برای ارزیابی کیفیت یک تیم نرم افزاری درست کردم.بهترین چیز درباره این تست اینه که فقط سه دقیقه طول خواهد کشید که کلیاتش رو درک کنید و پس از آن شما با وقتی که از اون شش سال باقی مونده براتون می مونه می تونید برید و یه مدرک پزشکی بگیرید.

Joel Spolsky

تست جوئل

  1. آیا از سورس کنترل استفاده می کنید؟
  2. آیا می توانید از کدتان یک برنامه اجرایی بسازید؟
  3. آیا میتوانید روزانه از کد برنامه اجرایی بگیرید؟
  4. آیا شما یک پایگاه داده برای نگه داری باگ ها دارید؟
  5. آیا قبل از نوشتن کد جدید، اشکالات را رفع می کنید؟
  6. آیا برای آپدیت کردن نرم افزار برنامه ریزی دارید؟
  7. آیا نرمافزار شما تحلیل و داکیومنت دارد؟
  8. آیا برنامه نویسان دارای فضای آرام برای کار هستند؟
  9. آیا از بهترین ابزارهایی که می توانید بخرید استفاده می کنید؟
  10. آیا افرادی را دارید که کار تست را انجام دهند؟
  11. آیا از کارمندان جدید آزمون کد نویسی میگیرید؟
  12. آیا تست -قابلیت استفاده مجدد- را انجام می دهید؟

یکی از خوبی های این تست این است که جواب سوالات آن خیلی راحت و آسان است، بله یا خیر به همین راحتی.به ازای هر پاسخ بله به تیم خود امتیاز یک بدهید. شگفت انگیزترین نکته در مورد تست جوئل این است که شما واقعا نباید از آن استفاده کنید تا مطمئن شوید که نرم افزار نیروگاه هسته ای شما امن است.

  • نمره ۱۲ کامل است
  • نمره ۱۱ قابل تحمل است
  • ۱۰ یا کمتر یعنی شما باید مشکلات را جدی بگیرید.

حقیقت این است که اکثر شرکت ها و کمپانی های نرم افزاری با امتیاز ۲ یا ۳ در حال حاضر دارند پیش می روند و به کمک جدی نیاز دارند، چرا که شرکت هایی مانند مایکروسافت با امتیاز ۱۲ دارند کار می کنند.

البته، اینها تنها عوامل موثر بر موفقیت و یا شکست نیستند: به ویژه اگر شما یک تیم نرم افزاری عالی برای محصولی که هیچ کس آن را نمی خواهد(خوب مردم دلشان نمی خواهد که آن را بخواهند) داشته باشید. و این امکان وجود دارد که این تیم نابغه  هیچ یک از این موارد را انجام ندهد به این معنی است که هنوز قادر به تولید نرم افزار باوری نکردنی هستید که میتواند جهان را تغییر دهد. اما در طرف دیگر اگر تیم شما این ۱۲ مورد را رعایت کند شما می توانید به آنچه ک برایش برنامه ریزی میکنید برسید.

منبع

آشنایی با Application startup در ASP.NET Core 2

وظیفه کلاس StartUp پیکربندی سرویس های برنامه و مشخص کردن نحوه پردازش درخواست ها در خط لوله (pipeline) می باشد.

کلاس Startup

به طور کلی در این کلاس شامل ۲ بخش زیر است:

  • میتوان سرویس های مورد نیاز برنامه را در ConfigureServices تزریق کرد (DI)
  • یک متد اجباری به نام Configure که وظیفه مشخص نمودن pipeline و درخواست هایی به آن وارد می شوند را دارد.

 

این دو متد در زمان اجرا هنگامی که برنامه شروع به کار می کند فراخوانی می شوند.

public class Startup
{
    // Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    // Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        ...
    }
}

 

در سازنده کلاس Startup دوتا وابستگی به وسیله DI تزریق شده است:

  • IHostingEnvironment  برای پیکر بندی سرویس ها و تنظیمات بر اساس محیط توسعه
  • IConfiguration برای پیکربندی تنظیمات سیستم در هنگام اجرای برنامه

 

public class Startup
{
    public Startup(IHostingEnvironment env, IConfiguration config)
    {
        HostingEnvironment = env;
        Configuration = config;
    }

    public IHostingEnvironment HostingEnvironment { get; }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (HostingEnvironment.IsDevelopment())
        {
            // Development configuration
        }
        else
        {
            // Staging/Production configuration
        }

        // Configuration is available during startup. Examples:
        // Configuration["key"]
        // Configuration["subsection:suboption1"]
    }
}

برنامه می تواند کلاس های راه اندازی جداگانه برای محیط های مختلف (به عنوان مثال، StartupDevelopment) را تعریف کند و کلاس مناسب را در زمان اجرا بر اساس محیط توسعه انتخاب می کند. اگر برنامه در محیطی توسعه اجرا شود که شامل هر دو کلاس راه اندازی یعنی یک کلاس StartupDevelopment و کلاس StartupDevelopment باشد. کلاسی که نام پسوند آن با محیط فعلی مطابقت دارد در اولویت قرار می گیرد.

 

متد ConfigureServices

این متد، یک متد :

  • کاملا اختیاری است.
  • توسط وب هاست قبل از configure برای پیکربندی سرویس های اپلیکیشن فراخوانی می شود.
  • جایی است که در آن می توان مشخص کرد چه تنظماتی یا فایل پیکربندی برای برنامه انتخاب می شود.

 

با اضافه کردن سرویس ها در این متد باعث می شود که این سرویس یا کلاس در تمامی برنامه به خاطر DI در دسترس باشد.این عملیات یا به وسیله تزریق وابستگی ها و یا IApplicationBuilder.ApplicationServices انجام می شود.

خوب وب هاست هم ممکن است قبل از صدا زدن کلاس Startup خودش یک سری از سرویس ها را پیکر بندی کند.برای اطلاعات بیشتر می توانید به پیج Hosting  بروید.

برای ویژگی هایی که نیاز به تنظیم قابل توجهی دارند، روش افزودن [Service] را در IServiceCollection وجود دارد. یک برنامه وب معمولی سرویسهای Entity Framework، Identity و MVC را لازم دارد .

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

 

سرویس های قابل دسترس در Startup

وب هاست یک سری از سرویس ها را فراهم می کند که به وسیله DI در سازنده کلاس Startup در دسترس هستند. بعد از آن اپلیکیشن (IApplicationBuilder) نیز در متد ConfigureServices بقیه سرویس ها را اضافه می کند. و در نهایت این سرویس ها در متد Configure  و سایر نقاط اپلیکیشن در دسترس خواهند بود.

 

متد Configure

در این متد نحوه رفتار با درخواست هایی که وارد برنامه می شوند مشخص می شود. این عملیات با استفاده از تعریف و اضافه کردن میان افزارهایی به IApplicationBuilder صورت میگیرد که در نهایت pipeline یا خط لوله ما را می سازد. اگر برای شما این سوال پیش آمده باشد که IApplicationBuilder چگونه در این متد در دسترس است در حالی که سرویس آن ثبت نشده است باید بدانید که IApplicationBuilder در خود وب هاست ساخته می شود و مستقیما به متد Configure پاس داده می شود.

در قطعه کد پایین در متد Configure خط لوله با سرویس های مدریتیت خطاهای زمان توسعه ( developer exception ) ،BrowserLinkبرگه های خطا (Error page) ،مدیریت فایل های ایستا و asp.net mvc کانفیگ شده است.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });
}

در کد  بالا هر بار که از تابع Use استفاده می کنیم یک Middleware به خطلوله درخواست اضافه می شود.به عنوان مثال هنگامی که از UseMVC استفاده می کنیم. routing middleware به pipeLine اضافه می شود .

تنظیمات بالا را می توان در همان فایل Program  نیز انجام داد.

public class Program
{
    public static IHostingEnvironment HostingEnvironment { get; }
    public static IConfiguration Configuration { get; }

    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                HostingEnvironment = hostingContext.HostingEnvironment;
                Configuration = config.Build();
            })
            .ConfigureServices(services =>
            {
                services.AddMvc();
            })
            .Configure(app =>
            {
                if (HostingEnvironment.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Error");
                }

                // Configuration is available during startup. Examples:
                // Configuration["key"]
                // Configuration["subsection:suboption1"]

                app.UseMvcWithDefaultRoute();
                app.UseStaticFiles();
            })
            .Build();
}

 

Startup filters

با استفاده از IStartupFilter می توان pipeline را در ابتدا و یا انتهای برنامه پیکربندی (config) کرد. یکی از مزایای استفاده از  IStartupFilter این است که اطمینان حاصل کنیم که میان افزار قبل و یا بعد از میان افزار های اضافه شده به خط لوله (چه در ابتدا و چ در انتها) اجرا می شود یا خیر.

IStartupFilter یک متد را پیاده سازی میکند که ورودی و خروجی آن هر دو از نوع <Action<IApplicationBuilder است.یک  IApplicationBuilder یک کلاس را میسازد که خط لوله را برای درخواست ها پیکر بندی می کند. برای اطلاعات بیشتر به اینجا مراجعه کنید.

منبع

تمام آنچه که یک برنامه نویس Asp.Net باید درباره رویدادهای HTTP Request در IIS بداند.

چکیده:

چرخه عمر یک برنامه ASP.NET با درخواست فرستاده شده توسط یک مرورگر به سرور وب مانند IIS آغاز می شود. اگر شما یک توسعه دهنده ASP.NET هستید که ماژول ها و سایر اجزای اپلیکیشن را ایجاد می کند، مهم است که چرخه زندگی درخواست های HTTP را در IIS یا هر وب سرور دیگری درک کنید. این مقاله به شما یک ایده و پیش زمینه از اتفاقاتی که هنگام پردازش درخواست HTTP انجام می شود، می دهد.

نکته: در IIS 6.0 دو خط لوله پردازش (pipeline) درخواست وجود دارد: یکی برای فیلترهای ISAPI موجود در کد Native  و دیگری برای برنامه های مدیریت شده مثل ASP.NET. با این حال در IIS 7.0، یک خط لوله پردازش تقاضای یکپارچه برای همه درخواستها وجود دارد. زمان اجرا ASP.NET با وب سرور یکپارچه شده است. همچنین توجه داشته باشید که اگر IIS 7 برای کار در حالت کلاسیک به جای حالت مجتمع پیکربندی شده باشد دقیقا مثل نسخه ششم عمل می کند.

هنگامی که یک درخواست برای IIS ساخته می شود، در صف اجرای درخواست های برنامه قرار میگیرد.این صف اجرا (Application pool) یک سری از آدرس های url  هستند که منتظرند تا به برنامه وارد شوند. (w3wp.exe) مسئول ارسال درخواست به برنامه است.

درخواست توسط خط لوله HttpApplication پردازش می شود و رویدادها به ترتیب زیر اخراج می شوند:

BeginRequest  رویداد BeginRequest باعث ایجاد هر درخواست جدید داده شده می شود. این رویداد همیشه اولین رویدادی است که در فرایند پردازش درخواست اجرا می شود.

AuthenticateRequest  رویداد AuthenticateRequest سیگنال هایی را نشان می دهد که پیکربندی  مکانیزم تأیید هویت درخواست فعلی را تأیید کرده است. تایید کردن درخواست در رویداد AuthenticateRequest تضمین می کند که درخواست قبل از پردازش درخواست ماژول متصل شده یا رویداد تایید شود.

PostAuthenticateRequest  رویداد PostAuthenticateRequest پس از رویداد AuthenticateRequest رخ می دهد. تمام اطلاعات در پروپرتی User از کلاس HttpContext قرار دارد و می تواند از آن استفاده کرد.

AuthorizeRequest  رویداد AuthorizeRequest نشان می دهد که ASP.NET درخواست فعلی را مجاز می داند.این رویداد را میتوانید مجوز های اختصاصی خودتان را بسازید.

PostAuthorizeRequest هنگامی رخ می دهد که کاربر برای درخواست فعلی مجاز است.

ResolveRequestCache هنگامی رخ می دهد که ASP.NET یک رویداد تایید را به اتمام میرساند تا ماژول های کش درخواست را از کش بخوانند، جلوگیری از اجرای پردازنده رویداد و فراخوانی هر متقاضی EndRequest.

PostResolveRequestCache – دستیابی به این رویداد به این معنی است که درخواست از کش نمیتواند خدمت کند و در نتیجه یک پردازنده HTTP ایجاد می شود. یک صفحه کلاس ایجاد می شود اگر یک صفحه ASP ایجاد شود.

MapRequestHandler – رویداد MapRequestHandler توسط زیرساخت ASP.NET برای تعیین پردازنده درخواست برای درخواست فعلی بر اساس نام فایل نام منابع مورد درخواست استفاده می شود.

PostMapRequestHandler – هنگامی رخ می دهد که ASP.NET درخواست فعلی را به دستگیرنده HTTP مناسب مطابقت می دهد

AcquireRequestState – هنگامی رخ می دهد که ASP.NET وضعیت فعلی (مثلا حالت جلسه) را به دست می دهد که با درخواست فعلی مرتبط است. یک شناسه جلسه معتبر باید وجود داشته باشد.

PostAcquireRequestState – زمانی رخ می دهد که اطلاعات دولتی (به عنوان مثال، وضعیت جلسه یا حالت برنامه) که با درخواست فعلی همراه است به دست آمده است.

PreRequestHandlerExecute – زمانی رخ می دهد که ASP.NET شروع به اجرای یک رویداد را انجام دهد

ExecuteRequestHandler – هنگامی رخ می دهد که پردازنده خروجی تولید می کند. این تنها رویداد نیست که توسط کلاس HTTPApplication نمایش داده شود.

PostRequestHandlerExecute – هنگامی رخ میدهد که پردازنده رویداد ASP.NET تولید خروجی را به پایان برساند

ReleaseRequestState – پس از اتمام ASP.NET، تمام پردازندههای درخواست درخواست را اجرا می کند. این رویداد سیگنال های ماژول های حالت ASP.NET را برای ذخیره وضعیت فعلی درخواست می کند.

PostReleaseRequestState – هنگامی رخ میدهد که ASP.NET تکمیل تمام پردازندههای رویداد درخواست را انجام داده و دادههای وضعیت درخواست همچنان حفظ شده است.

UpdateRequestCache – زمانی رخ می دهد که ASP.NET پایان اجرا یک رویداد را به دست می دهد تا ماژول های ذخیره سازی پاسخ های ذخیره شده را که برای خدمت یکسان از حافظه پنهان استفاده می شود، دوباره استفاده کنند.

PostUpdateRequestCache – زمانی که thePostUpdateRequestCache مطرح شده است، ASP.NET پردازش کد را تکمیل کرده و محتویات حافظه پنهان نهایی شده است.

LogRequest – درست قبل از اینکه ASP.NET هر گونه ورود به سیستم برای درخواست فعلی را انجام دهد. رویداد LogRequest حتی اگر خطایی رخ دهد، مطرح می شود. شما می توانید رویداد LogRequest را برای تحویل سفارشی برای درخواست ارائه کنید.

PostLogRequest – زمانی رخ می دهد که درخواست وارد شده باشد

EndRequest – هنگامی که ASP.NET به درخواست پاسخ می دهد، به عنوان آخرین رویداد در زنجیره ای از خط لوله HTTP رخ می دهد. در این حالت می توانید پاسخ را فشرده یا رمزنگاری کنید.

PreSendRequestHeaders – پس از EndRequest پس از روشن شدن (به طور پیش فرض) بوسیله روشن می شود. درست قبل از اینکه ASP.NET هدر HTTP را به مشتری ارسال کند، رخ می دهد.

PreSendRequestContent – زمانی رخ می دهد که ASP.NET محتوا را به مشتری ارسال کند.

امیدوارم این پست شما را در درک چگونگی جریان خط لوله HttpApplication کمک کند. مسلح با این دانش، شما می دانید که وقایع به دام افتاده برای انجام وظایف در زمان مناسب از چرخه زندگی رویداد.

امیدوارم که شما این مقاله را دوست داشته باشید و از شما برای دیدن آن متشکرم

منبع

آشنایی با تزریق وابستگی ها (IOC,DI)

درک بسیاری از مفاهیم واقعا مشکل است ولی در واقع خیلی آسان به طور روزمره از آن ها استفاده می کنیم.در پست قبلی در رابطه با اصول SOLID صحبت کردیم. امروز، من می خواهم در مورد مسئله وابستگی ها در برنامه نویسی صحبت کنم و روش هایی که این مشکل را رفع می کنند.

ادامه نوشته »

آشنایی با SOLID در شی گرایی

SOLID یک مفهوم در شی گرایی می باشد. از این مفهوم بیشتر به عنوان یکی از مجموعه قوانین شی گرایی یاد می شود. این واژه از به هم پیوستن عبارات زیر به وجود آمده است.هر یک از عبارات یک قانون را در این رابطه بیان می کنند که  در ادامه هر کدام را به شکل کامل تری توضیح خواهیم داد. ادامه نوشته »