enum-praktikada

Enum praktikada

Əvvəlki məqalələrimizdə C# dilinin sintaktik vahidlərinin bəzilərini izah edərkən bu dildə yazılan kitabların böyük əksəriyyətinin praktiki nümunələrdən yoxsun olduğunu qeyd etmişdim. Bu dəfəki mövzumuz C# dilində texniki tərəfdən asan, amma praktiki tərəfdən zəif nümunələrlə göstərilən enum-lardan(sadalamalar) danışacam. İndiyə kimi işlədiyim bir sıra proyektlərdən real kod nümunələri gətirərək praktikada enum-ların yerini göstərməyə çalışacam.


PS: Əvvəlki məqalələrdə dediyim kimi, terminləri bizim dilə tərcümə etməyi sevmirəm amma bir sıra terminlər artıq təbii formada tədrisim boyunca mənimlə irəliləyib və qəlibləşib. Bunlardan biri enum sözünün dilimizə tərcümə etdiyim forması olan sadalama-lardır. Məqalə boyunca enum/sadalama bir mənada sinonim olaraq verilib.

Sual 1. Enum nədir?

               Enumlar(Sadalamalar)- bir çox dillərdə olduğu kimi, C# dilində də hər hansı bir informasiyanın sadalanması zamanı istifadə olunur. Enum-lar valuetype olmaqla default olaraq int tipindən formalaşırlar. Əgər sadalanacaq olan informasiya rəqəmsal olaraq 255-dən artıq qiymət saxlamırsa, yaddaşda əlavə yer tutmasın deyə birbaşa tipini byte olaraq göstəririk. Əgər enum içərisindəki sadalanan məlumatların qarşısında rəqəm göstərilməyibsə ozaman sayma prosesi 0-dan başlayır. Bəzi hallarda manual olaraq həmin rəqəmləri əllə göstərməli oluruq.

namespace enums_in_practice
{
    public enum RequestType : byte
    {
        HttpPost = 1,
        HttpGet = 2,
        HTTPPut = 3
    }
}

               Bütün enumlar default olaraq Enum adlanan klasdan əmələ gəliblər. Enum klası abstrakt klasdır lakin “özəl”, low-level xarakter daşıdığına görə həmin klasdan birbaşa törəmək olmur.

Yaratdığımız bütün klaslar dolayı yolla birbaşa Enum klasından əmələ gəlirlər.

using System;
using static System.Console;
namespace enums_in_practice
{


    class Program 
    {
        static void Main(string[] args)
        {
            //sadalamanı byte tipində göstərdiyimizə görə əməliyyatları byte üzərindən edirik
            //enum rahatlıqla "arxasında dayanan" rəqəmlərə çevrilə bilir.
            byte type = (byte)RequestType.HttpGet;//geriyə "2" qiymətini qaytarır


            //həmçinin byte tipli informasiyanı rahatlıqla enum-a çevirə bilirik
            RequestType requestType = (RequestType)2;


            //enumda olan HttpGet,HttpPost yazılarını almaq üçün GetNames() metodu ist/olunur.
            Array.ForEach(Enum.GetNames(typeof(RequestType)), x => WriteLine(x));


            //enumda olan rəqəmləri almaq üçün GetValues() metodu istifadə olunur
            Array.ForEach((byte[])Enum.GetValues(typeof(RequestType)), x => WriteLine(x));


            //Parse metodu vasitəsilə string məlumatı Enum-a çevirmək olur
           RequestType fromString = (RequestType)Enum.Parse(typeof(RequestType), "3");


            // 5 rəqəminin bizim sadalamada qarşılığı yoxdur deyə geriyə false qayıdır.
            bool hasCurrentValue = Enum.IsDefined(typeof(RequestType), "5");
            
            ReadLine();
        }
    }
}

İndi gələk işlədiyim bəzi proyektlərdəki Enum və onların istifadəsini tələb edən texniki tapşırıq parçalarına...

Enumlar praktikada harada istifadə oluna bilər?

İstifadə halı 1:

İşlədiyim yerli bank inteqrasiya layihələrindən birində texniki tapşırıqda bildirilmişdiki, müştəri ödəmə terminalı vasitəsilə aşağıdakı əməliyyatları apara bilər:

1)Kreditlərini müştəri kodu vasitəsilə ödəmək

2)Debet karta mədaxil

3)Müqavilə kodu ilə kredit ödənişi

Tələbi ödəmək üçün belə bir enum yaratmışdım:

public enum ReceiptType : byte
    {
        Customer_CreditCode_Credit = 1,
        Customer_Contact_Credit = 2,
        Customer_Debet = 3
    }

Həmin sistemdə 2 tip ödəniş üçün ayrı-ayrı text informasiya qəbul edirdi. Onu enum-a çıxarmaq alınmırdı, çünki servisə sorğu göndərən zaman həmin text informasiyaları, ödəniş növünü göstərmək üçün lazım idi. Bəzi hallarda belə birşeylə rastlaşanda C# dilində enum-ın string variantı olmadığına görə static class-dan istifadə etmişdim. Məqsəd hər yerdə təkrarlanan eyni text yazılarını bir yerə toplamaq idi. Əslində məsələni reflektiv formada yerinə yetirmək olardı amma bu sürəti xeyli aşağı salacaqdı.

 public static class RequestType
    {
        public static string Accountcred = "Accountcred";
        public static string Account = "account";
    }

İstifadə halı 2

Servisdən gələn müxtəlif cavab əsasında proqram gedişatını təmin etmək

 Xbank layihəsində qarşıdakı servisdən gələn cavab əgər "1" olarsa istifadəçi tapıldı, əks halda yəni "0" olarsa istifadəçi tapılmadı anlamını bildirirdi. Bunu enum ilə implement(realizə) etmişdim.

 public  enum XBankResponse
    {
        Customer_Found = 1,
        Customer_Not_Found = 0
    }

İstifadə halı 3.

Oxuduğunuz saytda kurs bölməsinə bir sıra əlavələr edilsə də production üçün hələ relizə buraxılmayıb. Saytımızda istifadəçilərə 3 tip kurs təqdim ediləcək: Offline, Online və video kurs şəklində. Bununçün belə bir enum formalaşdırılıb:

namespace Brain2BrainWebApp.Models
{
    public enum CourseType
    {
        VideoCourse,
        Online,
        Offline
    }
}

İstifadə halı 4

Yazdığım saytlarda adətən loqlama prosesini yerinə yetirmək lazım olur. Proyektdən - proyektə loqlamanın aspekti dəyişə bilir. Proyektlərdən birində loqlama prosesini həyata keçirmək üçün, hansı tip loqlama aparıldığını müəyyən etmək üçün belə bir enum yazmışdım.

public enum LogOperationType : Byte
    {
        Inserted = 1,
        Updated = 2,
        Deleted = 3
    }

İstifadə halı 5.

Verilənlər bazasında  aparılan əməliyyatın  tipini identifikasiya etmək üçün:

public enum ActionType
    {
      Delete = 2,
      Update = 1,
      Insert = 0
    }

İstifadə halı 6

X bir şirkət üçün yazdığım lahiyələrdən birində ölkəyə gələn nümayəndə heyətinin yemək növünü seçə bilməsi üçün :

 public enum MealType
    {
        Lunch = 2,
        Dinner = 3,
        Breakfast = 1
    }

İstifadə halı 7

Eyni layihənin bir digər modulu mail sistemi ilə bağlı idi. Əgər jurnalistlər yarışda iştirak etmək istəyirdilərsə əvvəlcə sayt vasitəsilə müraciət etməli, blank doldurmalı və gələn cavabı gözləməli idi. Cavabın növlərini belə bir enum ilə yazmışdım:

namespace AccreditationMS.Models.Domain
{
    public enum MediaStatusType:  byte
    {
        Investigating = 1,
        Rejected = 2,
        Accepted = 3
    }
}

İstifadə halı 8

Layihədə rol sistemini təmin etmək üçün belə bir rol sistemi strukturunu enum ilə əks etdirmək:

public enum Roletype : byte
    {
        SuperAdmin =  1 << 6,
        UEG = 1 << 5,
        LOC = 1 << 4,
        NF = 1 << 3,
        Group = 1 << 2,
        Individual = 1,
        Media = 1,
        MediaManager = 4,
        Observer = 2
    }

İstifadə halı 9.

Kartın növünü müəyyən edən zaman:

 public enum CardStatus
    {
        Deactive = 1,
        Active = 2
    }

İstifadə halı 10

Bir layihədə kartla bağlı problemi olan istifadəçilər sistemə girib ticket aça bilirdilər. Həmin ticketın statusunu təyin etməkçün:

public enum IncidentStatus
    {
        Open = 1,
        InProcess = 2,
        Close = 3,
    }

  Enum yaradılması tələbdən asılı olaraq dəyişə bilər. Bir çox layihələrdə domen modelinə enum olaraq start versəm də, sonradan onu verilənlər bazası modelinə çevirmək lazım olmuşdu. Bir modelin enum və ya database modeli olmasını müəyyən edərkən verdiyim suallardan biri "Dəyişiklik lazım olarsa bunu bazada ya kodda etməliyəm?" olub. Enum heç də həmişə yaxşı variant deyil. Əgər bir sadalanan məlumatın proyekt boyunca "qədərini" bilirsinizsə, sayı dəyişməyəcəksə ozaman sahatlıqla enum istifadə edə bilərsiniz.


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