‫۶ سال و ۶ ماه قبل، یکشنبه ۵ فروردین ۱۳۹۷، ساعت ۰۵:۳۵
این روش رو انجام دادم ولی متاسفانه سرویس  "MSSQLLocalDB" استارت نمی‌شد و از دستوارت زیر استفاده کردم و سرویس اجرا شد .
sqllocaldb stop mssqllocaldb
sqllocaldb delete mssqllocaldb
sqllocaldb start "MSSQLLocalDB"
‫۷ سال و ۳ ماه قبل، شنبه ۱۳ خرداد ۱۳۹۶، ساعت ۱۲:۵۷
دستورات  if ، switch مربوط به دوران زبان برنامه نویسی ساخت یافته است و مهمترین فرق بین زبان‌های شی گرا با ساخت یافته وجود dynamic dispatch است و این قابلیت به ما امکان می‌دهد که در زمان اجرا از حالتی به حالتی دیگر برویم. در اینجا ما پیچیدگی کد رو افزایش داده ولی این پیچیدگی دارای ارزش افزوده ای است که مهمترین آن این است که دیگر با object سرو کار داریم نه یک وضعیت.
عبارت switch با حالت enum-as-class کار نمیکند درست است زیرا آن زمان  switch را برای object‌ها طراحی نکرده بود و استفاده از switch یعنی هاردکد کرد برنامه و ما رو با مشکلات نگهداری و همچنین احتمال بروز باگ رو در برنامه افزایش میدهد.در این مقاله اشاره ای به حذف switch کرده ولی به خوبی مزایایی آن رو توضیح نداده است و یکی از این مزایا این است که ما حالات شرطی رو می‌توانیم بر اساس یک شی به کلاس استفاده کننده تزریق کنیم و مشکلات نگهداری برنامه کمتر شود. 
‫۷ سال و ۳ ماه قبل، شنبه ۱۳ خرداد ۱۳۹۶، ساعت ۰۱:۳۳
به صورت کلی استفاده  enum‌ها به تنهایی پیشنهاد نمیشود چون enum نشان دهنده یک وضعیت ( state ) است و ما در برنامه نویسی شی گرا نیاز به  وضعیت و رفتار ( state & behavior) داریم و یکی از مشکلات اصلی enum‌ها این است که قابلیت refactoring رو به خوبی ندارن به همین دلایل ما enum‌ها رو در یک کلاس قرار می‌دهیم مانند این مثال:
sealed class DeviceStatus : IEquatable<DeviceStatus>
    {
        [Flags]
        private enum StatusRepresentation
        {
            AllFine = 0,
            NotOperational = 1,
            VisiblyDamaged = 2,
            CircuitryFailed = 4
        }

        private StatusRepresentation Representation { get; }

        private DeviceStatus(StatusRepresentation representation)
        {
            this.Representation = representation;
        }

        public static DeviceStatus AllFine() =>
            new DeviceStatus(StatusRepresentation.AllFine);

        public DeviceStatus WithVisibleDamage() =>
            new DeviceStatus(this.Representation | StatusRepresentation.VisiblyDamaged);

        public DeviceStatus NotOperational() =>
            new DeviceStatus(this.Representation | StatusRepresentation.NotOperational);

        public DeviceStatus Repaired() =>
            new DeviceStatus(this.Representation & ~StatusRepresentation.NotOperational);

        public DeviceStatus CircuitryFailed() =>
            new DeviceStatus(this.Representation | StatusRepresentation.CircuitryFailed);

        public DeviceStatus CircuitryReplaced() =>
            new DeviceStatus(this.Representation & ~StatusRepresentation.CircuitryFailed);

        public override int GetHashCode() => (int)this.Representation;

        public override bool Equals(object obj) => this.Equals(obj as DeviceStatus);

        public bool Equals(DeviceStatus other) =>
            other != null && this.Representation == other.Representation;

        public static bool operator ==(DeviceStatus a, DeviceStatus b) =>
            (object.ReferenceEquals(a, null) && object.ReferenceEquals(b, null)) ||
            (!object.ReferenceEquals(a, null) && a.Equals(b));

        public static bool operator !=(DeviceStatus a, DeviceStatus b) => !(a == b);
    }
اگه دقت کرده باشید این کلاس به صورت value object طراحی شده است و از مهمترین ویژگی اینگونه کلاس‌ها این که تغییرناپذیر هستند. 
‫۷ سال و ۷ ماه قبل، یکشنبه ۸ اسفند ۱۳۹۵، ساعت ۲۲:۱۱
نکته تکمیلی:
 متد WithSurname  اصل Command Query Seperation   رو نقض میکنه چون در اینجا به صورت یک Query تعریف شده ولی در پایان وضعیت شی رو تغییر میدهد و همانند یک  Command رفتار میکند و برای حل این مشکل می‌توانیم به صورت زیر این متد رو بازنویسی کنیم:
  public IExpectPrimaryContactPersonBuilder WithSurname(string surname)
    {
        return new PersonBuilder {
                  Name = this.Name;
                  Surname = surname;
          }
    }
همچنین میتوان از روش زیر هم استفده کرد:
class ExpectSurname : IExpectSurnamePersonBuilder
{

    private string Name { get; }

    public ExpectSurname(string name)
    {
        this.Name = name;
    }

    public IExpectPrimaryContactPersonBuilder WithSurname(string surname)
    {
        if (string.IsNullOrEmpty(surname))
            throw new ArgumentException(nameof(surname));
        return new ExpectPrimaryContact(this.Name, surname);
    }

}
برای سایر متدها هم میتوان از روش‌های بالا استفاده کرد.
‫۷ سال و ۹ ماه قبل، شنبه ۱۳ آذر ۱۳۹۵، ساعت ۱۸:۲۱
آیا در کل لزومی به استفاده از Maybe یا Option هست؟  بله
همانطور که در آخر این  مقاله اشاره کردم آشنایی با ایده Option شما رو به سمت برنامه نویسی تابعی می‌کشاند . برنامه نویسی تابعی به دلیل دارا بودن خاصیت  Immutable   ،  دارای مزایایی   هست که نمیشود به راحتی از آن عبور کرد.برای مثال اگر کلاینت ( مصرف کننده )  به امضای متد FindByIdAsync نگاه کند تنها برداشتی که میتواند کند این هست که این متد " ممکن است پستی رو برگرداند"، همین ویژگی خوانایی برنامه رو بالا میبرد و دیگر نیاز نیست که به صورت کامنت بالای کد خودتون بنویسید "این کد ممکن است که خطای NRE و بلا بلا بلا..." صادر کند بلکه امضای متد همچین کاری برای شما نجام میدهد و دیگر نیازی به کامنت نیست.
 برنامه نویسی تابعی باعث می‌شود که کد قابل نگهداری ، خوانایی و غیره رو افرایش دهد.به این مثال توجه کنید:
 public async Task<Maybe<Post>> FindByIdAsync(Guid id)
        {
            Maybe<Post> post = await _posts.FindAsync(id);
            return post;
        }
و اگر بخواهیم از متد FindById در کد دیگر استفاده کنیم به صورت زیر خواهد بود :
 public async Task<Result> DeletePost(Guid id)
        {
            return await FindByIdAsync(id)
                .ToResult("پست مورد نظر یافت نشد.")
                .OnSuccess(x => _posts.Remove(x))
                .OnSuccess(x => _unitOfWork.SaveChangesAsync())
                .OnBoth(x => x.IsSuccess ? Result.Ok() : Result.Fail(x.Error));
        }

‫۷ سال و ۱۰ ماه قبل، چهارشنبه ۱۰ آذر ۱۳۹۵، ساعت ۲۳:۰۰
یک نکته تکمیلی
 public class SallowMutable
    {
        public int Value { get; }
        
        //Mutable
        public StringBuilder NameBuilder { get; }

        public SallowMutable(int value, StringBuilder nameBuilder)
        {
            Value = value;
            NameBuilder = nameBuilder;
        }
    }
کلاس بالا به ظاهر به صورت Immutable پیاده سازی شده است  و اگر کلاینت به صورت زیر از کلاس بالا استفاده کند متوجه خواهید شد این پیاده سازی Immutable نیست زیرا StringBuilder از نوع Mutable است.
 public class UsageOfSallowMutable
    {
        public static void Main()
        {
            StringBuilder x=new StringBuilder();
            var sm=new SallowMutable(10,x);
            x.Append("Ali");
            sm.NameBuilder.Append(" Reza");
            Console.WriteLine(sm.NameBuilder);// Ali Reza
        }
    }

‫۸ سال و ۵ ماه قبل، پنجشنبه ۹ اردیبهشت ۱۳۹۵، ساعت ۲۱:۱۱
چه جوری میشه از  الگوی طراحی Command  در Mvc استفاده کرد؟
بنده چند نمونه پیدا کرده ام مثل
ولی برام یکم گنگ هست اگه میشه راهنمایی کنید 
‫۸ سال و ۵ ماه قبل، دوشنبه ۶ اردیبهشت ۱۳۹۵، ساعت ۰۱:۵۹
من تو سورس برنامه این متد رو
 public string GetTranscriptsUrl()
        {
            var courseName = getCourseName();
            return $"http://app.pluralsight.com/data/course/transcript/{courseName}/en";
        }
رو به صورت زیر تغییر دادم
  
         public string GetTranscriptsUrl()
        {
            var courseName = getCourseName();
            return $"http://app.pluralsight.com/data/course/transcript/{courseName}/fa";
        }  
 ولی هنگامی که فایل رو به Srt تبدیل میکنه زیرنویس دارای کلمات ناخوانا میشه