F # də Beerway yönümlü proqramlaşdırma

Giriş

Bu blog yazıda əvvəlki blog yazılarından ayrıldığımızı davam etdiririk. Biz aşağıdakıları etmək istəyirik:

  1. Sözləri düzəldin ki, həddindən artıq sərt kodlu mumbo jumboslarından heç biri davam etməsin. Proses başlayanda MongoDb-dan MLab vasitəsilə yüklənən konfiqurasiyamızı saxlayırıq. Yalnız sabit kodlu dəyər Mongo serverinə qoşulmaq üçün istifadə olunan bağlantı sətridir.
  2. Bir neçə pivə zavodu üçün boru kəmərinin icrası üçün planlaşdırıcının ümumiləşdirilməsi.
  3. Prosesi vaxtında başlamağı planlaşdırın.
  4. MongoDb üzərində daimi cızıqlar.

Expecto istifadəsini sınayacağıq və bu seriyada üçüncü blog yazılarında Logary vasitəsilə giriş əlavə edəcəyik.

Hazırlıqlar

Atle Rudshaug'dan NoDifference davasının müalicəsi ilə əlaqədar böyük bir məsləhət aldım. NoDifference işinə uğur kimi baxmalıyıq. Fərq tapılmırsa, heç bir mətn göndərməyin.

Dəyişdirilmiş səhv modulumuz indi belə görünür:

İndi sadəcə cari və əvvəlki sıfır arasındakı fərqi hesablayan funksiyanı müqayisə edin.

Bildiriş funksiyası, mətnin göndərilməsinin və ya müəyyən edilmiş fərqin kardinallığına əsaslanmadığını müəyyən etməlidir.

Daha sonra vurğulanacaq olan boru kəmərinin ümumiləşdirmə istiqamətini təyin etmək üçün "Adı" adlı məlumat dəstimizə yeni "String" tipli element əlavə edirik.

Yenilenmiş qeyd növü və Chiron üçün statik elementləri olan BeerInfo.fs faylıımız indi belə görünür:

Konfiqurasiya və ümumiləşdirmə

Bütün sərt kodlu hərflərdən qurtulaq və boru kəmərini yalnız Yorğun Əllər yerinə pivə zavodlarının siyahısına ümumiləşdirək. Bu günə qədər ümumi komponentləri ayırmaq üçün yaxşı bir iş görmüşük. daha yaxşı edə bilərik! Bütün konfiqurasiyaları buludlara köçürək və boru kəmərini ümumiləşdirək.

Tikinti

Bütün konfiqurasiya detallarını saxlamaq üçün MLab-ın pulsuz səviyyəsindən istifadə edəcəyik. Əvvəlcə "beerwayoriented proqramlaşdırma" adlı bir verilənlər bazası yaradırıq və konfiqurasiya toplusunu əlavə edirik. Bu olduqca sadə bir proses olmalıdır. MLab istifadəçi interfeysi fantastikdir! Hər hansı bir probleminiz varsa, zəhmət olmasa mənə müraciət edin.

Konfiqurasiya kolleksiyasında əvvəlcə Twilio məlumatlarımız olan bir sənəd olmalıdır. Daha çox sahə əlavə etmək istəsək, daha sonra qərar verə bilərik.

Bir dəfə saxlanıldıqdan sonra konfiqurasiya kolleksiyası bu kimi bir şeyə bənzəyir:

{"_Mən edərdim": {$ oid: 5976bcc1734d1d6202aa1556}, "MyPhoneNumber": "Telefonunuzun nömrəsi", "HesabSID": "Sizin twilio hesabınız sid", "AuthToken": "İkiqat avtoritet əlamətiniz", "GöndərənPhoneNumber": "Sənindir. twilio telefon nömrəsini göndərir "}

Verilənlər bazası ilə əlaqə

Sonra biz mongocsharpdriver və MongoDB.FSharp arayışını PACKAGE vasitəsilə əlavə edirik. Bunu necə edəcəyinizə əmin deyilsinizsə, PAKETdən istifadə barədə məlumat olan əvvəlki yazını oxuyun və asılılıqların uğurla istinad edildiyini yoxlayın.

Səhv modulundan əvvəl, "Common.fs" faylında "Db" adlı yeni bir modul yaradırıq ki, bu da verilənlər bazası ilə əlaqəli bütün funksiyaları ehtiva edir. Bundan əlavə, əvvəllər müqayisə etmə modulunda işlədiyimiz JSON faylının deserializasiyası / seriyası üçün bütün kodlar silinir.

Sərt kodlu olan yeganə hərfi bağlantı simidir. [Yaradıcı olmaq istəyirsinizsə, onu FSharp.Configuration kitabxanasından istifadə edərək bir konfiqurasiya faylında saxlaya bilərsiniz.]

Ümumiyyətlə, Db modulu bu kimi görünür:

Mongo + F # CRUD haqqında daha ətraflı məlumatı əvvəlki blog yazılarımda tapa bilərsiniz. Konfiqurasiya ilə dəyişdirilmiş siqnalizasiya modulu indi belə görünür:

Ümumiləşdirmə

Yalnızca pivə istehsalçısına məxsus kodu pivə istehsalçısına aid analizatorda və pivə zavodu üçün boru kəmərini ehtiva edən əsas funksiya sənədindədir. Pivə istehsalçısının adı əsasında Json faylını yaratmaq üçün Müqayisə et modulunu dəyişdirməliyik.

Dəyişən BeerwayOrientedProgramming modulu indi belə görünür:

Müqayisə et modulunda dəyişdirilmiş müqayisə funksiyası indi belə görünür:

Planlayıcı

Növbəti addım, pivə zavodu borularını bir taymerdə işlətmək üçün bir planlaşdırıcı qurmaqdır. Bunun üçün Quartz.NET proqramını PACKAGE vasitəsilə planlaşdırırıq.

Bu F # parçadan sonra, bütün pivə zavodlarından keçmək üçün planlaşdırılmış bir prosesi asanlıqla qura bilərik və hər 2 saniyə üçün təfərrüatları əbədi olaraq təhlil edə bilərik.

Pivə tədarükümüzlə mübahisə etmirik, ancaq pivənin şirkət səviyyəsində bazuka alması prosesini edirik.

Davamlı cızıqlar

Nəhayət, qırmızı vərəqlərimizi eyni pivə yönümlü proqramlaşdırma ilə eyni MongoDb verilənlər bazasında saxlamaq imkanını əlavə edək.

Prosesimizi ümumiləşdirdiyimizə görə, digər pivə istehsalçılarını asanlıqla əlavə etmək üçün, JSON seriyasını və deserializasiyasını bir fayldan çıxardıqdan sonra pivə istehsalçısının adı əsasında verilənlər bazasının kolleksiyalarını adlandıracağıq. var.

Birincisi, Chiron əsaslı statik elementləri çıxardıqdan sonra BeerInfo rekord növünü yenidən yoxlamaq və BsonObjectId MongoDb ID əlavə etməklə bütün köhnə JSON seriya və deserializasiya komponentlərini çıxarın.

Yeni BeerInfo modulu bu kimi görünür:

Diqqət etsəniz, F # One-ın yaradıldığı C # MongoDb sürücüsünə uyğunlaşmaq üçün "Beers" növünü bir FSharp siyahısından "Bir" -ə "System.Generic.Collections" olaraq dəyişdirdik.

Artıq ehtiyac olmadığımız üçün Chiron-a dair məlumatı silib çıxaracağıq. Bunu etmək üçün əmr palitrasını açın [Cmd + Shift + P] və fsproj faylı açdıqdan sonra PAKET-in çıxarılması arayışına aşağıdakı kimi gedin.

Chiron-a istinad aradan qaldırıldıqdan sonra, yeni şəxsiyyət sənədlərinin yaradılması və əvvəlki qırıntıların alınması ilə əlaqəli bəzi metodlarımızı Db modulumuza əlavə edəcəyik.

Pivə zavodu adı ilə kolleksiyanı əldə etmək istəyində bir istisna baş verərsə, onu blokda yenidən yaratmağa cəhd edilir.

Parçaları müqayisə modulundan Db moduluna saxlayaraq mürəkkəbliyi son qırıntıları tutaraq azaltdıq. Son qırıntıların null olmadığını yoxlayırıq [FirstOrDefault () istifadə etdiyimizə görə etibarsızlığı yoxlamaq üçün bir obyektə çevirdikdən sonra.

Yenilənmiş TiredHandsScraper.scrape funksiyamız indi belə görünür:

GetBeerNamesFromTiredHands funksiyası bu kimi görünür:

Bundan əlavə, müqayisə modulumuz xeyli sadələşdirilmişdir:

Tıraşlarımızın davam etməsi çox yaxşıdır, bu sənədləri TiredHands kolleksiyasında yoxlamaqla təsdiqlənə bilər:

Nəticə

Konfiqurasiyanı əlavə etmək, ümumiləşdirmək, planlaşdırmaq və saxlamaqla mütləq uzun bir yol qət etdik. Artıq qeyd edildiyi kimi, bu seriyadakı növbəti və son yazı bir dəfə sadə tətbiqetməni tam inkişaf etmiş birinə çevirmək üçün bəzi sınaqları və girişləri ehtiva edir.

Rəylərinizi almaqdan həmişə məmnunam!