inheritance-praktikada

Inheritance praktikada

Öz təcrübəmə əsaslanaraq deyə bilərəm ki, bir çox proqramlaşdırma kitablarında, xüsusən konkret proqramlaşdırma dillərinə aid olan kitablarda OOP(Object Oriented Programming) anlayışlarına aid çox zəif misallar verilir. Real həyatı əks etdirməyən bu misallar əsasında isə sizdən yaxşı proqram yazmağı tələb edirlər...

               Bugün C# dilinə aid həmin kitablarda haqqını vermədiklərini düşündüyüm inheritance haqda real nümunələr göstərəcəm. Düzdür, bir tərəfdən həmin nümunələri anlayıram,çünki proqramlaşdırmaya yeni başlayanlara desən ki,misalçün bir klasın kontroller olaraq işləməsi üçün Controller klasından törəməlidir, ozaman həmin adama kontrellerin və ümümiyyətlə onun bağlı olduğu texnologiyanın nə işə yaradığı da izah etmək lazım olacaq.

Bugünki məqaləmin oxucularından istəyim ən azından C# dilində çox sadə proqramlar yaza bilmələri, ASP.NET ,WinForm kimi texnologiyaların adlarını eşidib nə işə yaradıqlarını bilməkləridir.


PS: İnheritance sözü müəllif tərəfindən 10ildən artıqdır ki, “törəmə” olaraq tədris edilir. Bəzi proqramçılar bunu ümumiyyətlə tərcumə etmədən sadəcə “inheritance” deyir(dəstəkləyirəm), digərləri “varislik,miras” kimi sözlərlə ifadə edirlər.


PSS: Kod nümunələrinə baxarkən mütləq koda yazılmış qeydləri diqqətlə oxuyun!!


PSSS: Törəmənin çox dərin bir teoriyası var və məqaləni mümkün qədər asan saxlamaq üçün buna yer verilməyib.


Inheritance(Törəmə) ana klasın funksionallığını genişləndirmək, kod təkrarının qarşısını almaq və böyük proqram arxitekturaları quran zaman ierarxik mexanizmi yaratmaq üçün istifadə olunur.

Inheritance praktikada :

1.      C# dilində ən təməl anlayışlardan olan dəyişənləri(variables) öyrənərkən bütün tiplərin object klasından əmələ gəlməsi. Əgər törəmə ierarxiyası olmasaydı tiplər arası keçid etmək mümkün olmaz, klasları və interfeysləri polimorfik formada işlətmək mümkün olmazdı.

static void Main(string[] args)
        {
            //Bütün tiplər birbaşa və ya dolayı yolla mütləq OBJECT-dən əmələ gəlir
            int number = 80;
            //int objectdən dolayı yolla törəyib, ona görə object tipinə çevrilə bilir
            object data = number;


            //reference type-lar objectdən birbaşa törəyib, ona görə object tipinə çevrilə bilir
            string str = "Some data";
            data = str;
        }

2.      Bütün yaratdığımız custom classlar, mütləq şəkildə ana klası olan object dən törəyir.

class Person
    {
        public string Name { get; set; }
        public string Email { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {
            //Bütün custom classlar,dəqiq ana klası göstərilmədiyini müddətcə
            //birbaşa  mütləq Object-dən əmələ gəlir
            Person person = new Person();
            //custom class bunun hesabına rahatlıqla ana klasa çevrilir
            object obj = person;
           
        }
    }

3.      Custom class yaradan zaman GetHashCode(),ToString(),Equals() ,GetType() kimi metodlar hamısı törəmə vasitəsilə bizə gəlir

4.      Törəmə olmasaydı proqram komponentlərində abstraktlıq yaradaraq əvəzlənəbilən kod yazmaq mümkün olmazdı

static void Main(string[] args)
        {
            //goründüyü kimi bu metoda DbConnection klasının istənilən realizasiyasını 
            //ötürə bilərik
            Connect(new SqlConnection());


            Connect(new OleDbConnection());


            Connect(new MySqlConnection());
           
        }
        static void Connect(DbConnection dbConnection)
        {
            throw new NotImplementedException();
        }

5.      C# dilində custom istisnalar(exception) yaratmaq üçün mütləq şəkildə Exception clasından törəmək lazımdır.

  public class SimpleException : Exception
    {
        public SimpleException() { }


        public SimpleException(string message) : base(message) { }


        public SimpleException(string message, Exception inner) : base(message, inner) { }
        
        protected SimpleException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
    }

6.      Windows Form texnologiyasında istənilən bir app yazarkən, əgər ikinci ,üçüncü Form-lar yaratmaq istəyiriksə həmin formalar Form klasından törəməlidir

 public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }


        private void Btn_login_register_Click(object sender, EventArgs e)
        {
           //...
            //....
        }
    }

7.      WinForm-da custom component yaradan zaman həmin komponent Control,o isə Component klasından törəməlidir!


8.      C# dilində işlətdiyimiz bütün massiv formaları dolayı yolla Array klasından törəyir, ona görə massivlər üzərində ümümi əməliyyatlar aparan zaman Array klasından istifadə olunur.

9.      Atributlar birçox işlər görən zaman işimizi asanlaşdırır, bir çox hallarda interfeyslərlə çiyin çiyinə böyük arxitektur vahidlər formalaşdırmağa xidmət edir. Məhz atributlar hesabına validasiya, runtime binding, fitrasiya,CCC(cross cutting concern),avtorizasiya,autentifikasiya və daha nələr nələr yerinə yetirmək olur. Əgər sadalananlardan birini yaratmaq istəsək ozaman Attribute klasından törəməliyik

namespace AccreditationMS.Infrastructure
{
    // ActionFilterAttribute klası arxa planda Attribute klasından törəyir...
    public class DelegationFillAttribute  : ActionFilterAttribute
    {
        private IDelegationRepository _context;
        private UserManager _userManager;
        public DelegationFillAttribute(IDelegationRepository context, UserManager userManager)
        {
            _context = context;


            _userManager = userManager;
        }
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var controller = context.Controller as Controller;


            if (controller != null)
            {
                int? eventId = controller.HttpContext.Session.GetInt32("eventid");
                if (eventId != null)
                {
                    AppUser currentUser = controller.HttpContext.Session.GetJson("CurrentUser");
                  Delegation delegation =  _context.GetDelegationByEventId((int)eventId, currentUser.Id);
                    if(delegation == null)
                    {
                        controller.ModelState.AddModelError("err", "Please fill delegation information first!!");
                       context.Result = controller.RedirectToAction("Delegation", "Accreditation");
                    }
                    


                }
                else
                    context.Result = new RedirectToActionResult("Add", "Event", null);


            }
            base.OnActionExecuting(context);
        }
    }
}

10.  Genericlərdə kovariant və kontravariantlıq mexanizmi tamamilə törəmə üzərinə qurulub. Saytımızdan kovariantlıq kontravariatlıq haqda detallı oxuya bilərsiniz.

11.  ASP.NET MVC-də(+ Core) kontroller yaratmaq üçün bütün klaslar Controller klasından törəməlidir.

public class HomeController : Controller
    {
        private readonly SomeAppDbContext someAppDbContext;
        private readonly IPaginatedMetaService _paginatedMetaService;
        public int PageSize = 8;
        public HomeController(SomeAppDbContext dbContext, IPaginatedMetaService paginatedMetaService)
        {
            someAppDbContext = dbContext;
            _paginatedMetaService = paginatedMetaService;
        }
    }

12.  ASP.NET MVC Core-da səhifədə təkrarlanan dinamik hissələr üçün ViewComponent yaratmaq üçün eyniadlı klasdan törəmək lazımdır.

 public class RecentPopularViewComponent : ViewComponent
    {


        private readonly SomeAppDbContext _dbContext;
        public RecentPopularViewComponent(SomeAppDbContext dbContext)
        {
            _dbContext = dbContext;
        }


        public async Task InvokeAsync()
        {
            string lang = HttpContext.GetRequestedLanguage();
            var sidebarRP = new SideBarRPModel
            {
                PopularArticles = await _dbContext.Posts
                                    .Where(x=>x.Language == lang)
                                     .OrderByDescending(x => x.ViewCount)
                                        .Take(5).Select(x=>new RecentPopularModel
                                        { CreatedDate = x.CreatedDate, Id =x.Id,
                                         Image =x.Image, Name = x.Name, SlugUrl = x.SlugUrl}).ToListAsync(),
                
                RecentArticles = await _dbContext.Posts
                                          .Where(x => x.Language == lang)
                                           .OrderByDescending(x => x.CreatedDate)
                                          .Take(5).Select(x => new RecentPopularModel
                                          {
                                              CreatedDate = x.CreatedDate,
                                              Id = x.Id,
                                              Image = x.Image,
                                              Name = x.Name,
                                              SlugUrl = x.SlugUrl
                                          }).ToListAsync()
            };
            return View(sidebarRP);
        }
    }

13.  Asp.NET Core-da bir neçə dili dəstəkləmək üçün verilən standard provayderi istifadə etmək istəməsiniz ozaman IRequestCultureProvider interfeysindən törəməlisiniz.(Bəli interfeysdən törəmək!)

public class SegmentRequestCultureProvider : IRequestCultureProvider
    {
        public Task DetermineProviderCultureResult(HttpContext httpContext)
        {
            ProviderCultureResult cultureResult = null;
            if (httpContext.Request.Path.HasValue)
            {
                string[] segments = httpContext.Request.Path.Value.Split("/");
               //logic escaped
            }
            else
                cultureResult = new ProviderCultureResult(SupportedLanguage.DefaultLanguage);
            return Task.FromResult(cultureResult);
        }
    }

14.  Asp.NET Core-da səhifələrdə html ilə işi asanlaşdırma, bir mənada dinamik html generasiya etmək üçün tag helperlər yaratmaq olur. Tag helper yaratmaq üçün TagHelper klasından törəmək lazımdır.

 [HtmlTargetElement("div", Attributes = "page-model")]
    public class PageLinkTagHelper : TagHelper
    {
        private IUrlHelperFactory urlHelperFactory;


        public PageLinkTagHelper(IUrlHelperFactory helperFactory)
        {
            urlHelperFactory = helperFactory;
        }
   }

15.  Entity Framework istifadə edən zaman DbContext klasından törəmək lazımdır.

 

Belə.. Bu nümunələrin sayını 1000-ə qədər qaldırmaq olar amma sadəcə məqalədə əsas məqsəd o idiki törəmənin nə dərəcə əhəmiyyətli olduğu, proqram strukturu qurarkən onurğa sütünü rolu oynadığını görəsiniz.

Unutmayaq ki, törəmə heç də həmişə yaxşı variant deyil, amma yerli yerində düzgün istifadə olunduqda təkrar istifadəyə zəmin yaradır.

Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz