"Enter"a basıp içeriğe geçin

Bana paspasla bug öldürttünüz, paspasla! [Bir bugfix hikayesi]


Bu durumdaki duygularimi en iyi anlatan şey buydu: Serbest gibi hissediyorum

Umarım taft ekibi veya
Berkcan Ergin beni dava etmez.

Size 2 gündür çözmeye çalıştığım bug anlatayım.

Öncelikle ne yapıyoruz?

Angular ile yazılmış bir projeyi cordrova ile derleyip mobil uygulama olarak yayinliyoruz. Ben angular projesini yazmiyorum. Sadece bugfixlerde bilgi verip, cordova ile derleyıp mobil kalmasini sagliyorum. Bazen de Mobil featurelari gelistiriyorum..

Ne yapmak istiyoruz?

Bir dis servisimiz var. Online egitim platformu. Egitime git butonuna basinca acilsin istiyoruz.

Normalde window.open(link,”_blank”) ile calisiyor. tabi WebView icinde sekme yok.

Imdadimiza cordova-plugin-inappbrowser yetisiyor. Implematasyonu gayet basit.İki dakikalık iş …

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    window.open = cordova.InAppBrowser.open; // code smells ?
}

Boylece artik `new window` da acilmak istenen hersey cordova ile inApp browser olarak acilacak. Bence guzel cozum. Arkama yaslandim, derledim emulatorde denedim. guzel aciliyor. Done butonun da “Kapat” yaptim. Release haziriz.

Sorun: BUG ALERT !

Egitimi acmak istedigimizde yeni pencerede aciyor ancak, sonrasinda cikis yap butonuna basarsak logout oluyor ancak bu seferde tekrar eğitim linki popup açıyor. Saçma!

Dedim senin olmayan objeyi override etme Mahmut!. Hemen kodu kaldırdım. Sadece egiitimi acacak yere geldim. cordova.InAppBrowser.open(“dislinkadresi”,”_blank”); Arkama yaslandim ve tekrar derledim. Kendimden eminim cozuldu. Sonuc: Olmadi, hata devam ediyor. Dedim tek ben olamam. Daldim github issuelarini okumaya. Oradan bir sonuc cikmadi.

Sonra logout isleminde neler oluyor oraya bakayim, neyi ezdigini anlariz.

> Ey logout neredesin?

Hop bu service Spartacus ile geliyor. Kisaca spartacus nedir? SAP’nin gelistirdigi acik kaynak kodlu Hybris Ecommerce cozumu icin arayuz kutuphanesi.(https://github.com/SAP/spartacus). Acik kaynakli olmanin guzelligi gittim github adresine bulduk. router service,Router store, actıon, effect derken kim yönlendiren buldum

angular router service navigate methodu.
<Dedım cıkmaz sokak> bu olamaz heryerde kullanıyoruz. Dedım su inapp napıyor bir kodları okuyalım.

Döndük başa. Açık kaynak sağolsun, başladım InAppBrowser kodlarını okumaya. Generalist olmanın bir getirisi sagolsun object c kodunu da okuyabiliyorum. Basitte bir kod.

Suradanki js kodundan bir şüphelendim:



    module.exports = function (strUrl, strWindowName, strWindowFeatures, callbacks) {
        // Don't catch calls that write to existing frames (e.g. named iframes).
        if (window.frames && window.frames[strWindowName]) {
            var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
            return origOpenFunc.apply(window, arguments);
        }
        ...
}

// link: https://github.com/apache/cordova-plugin-inappbrowser/blob/8bdbd18d1619e25cf8bdedadf6448ef40b21ea7c/www/inappbrowser.js#L95

Sonra dedim alert.open biz ozune dondurelim.

delete window.open

// Reverts the call back to its prototype’s default
// Kaynak: https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-inappbrowser/index.html

Duzeldi mi?

InAppBrowser okumaya devam. Ancak bir an dedim ki acaba InAppBrowser degilde benim yazdigim kod mu bir cok kez calisiyor? (Ama ben o kodu sadece bir yerde kullandim, o da Egitim goster method) Kontrol ettim benim kodum sadece bir yerde cagiriliyor. Sonra bir alert yazayim icine de inAppBrowser mi tekrarlanan, benim kodum mu anlayalim. Ekledim.

Bir de ne goreyim, logout basinca benim alert cikiyor, ardindan sayfa aciliyor. AMA NASIL olur, sadece bir yerde var? Tekrar yazilan kodlari ve bagimliklari okurken ne göreyim!

//Http istegi yapan basit bir service file
this.userService.get()
      .subscribe(user => {
      if (window.isCordovaApp) {
        this.cordovaInAppBrowserService.open(lmsUrl);
      } else {
        window.open(user.lmsUrl, '_blank');
      }
    });

Eger bugi bir bakista gorebildiyseniz tebrik ederim. Siz o aydinlanmis yuce kisisiniz. Ben iste cok gec gordum ve sonra gelen bir aydinlanma …

GetUser methoduna subscipe oluyoruz ancak unsubscribe olmuyoruz. `MemoryLeak ama biz onu sonra hallederiz` ama iste beni bogdu bogdu, duvara atti, bogdu bogdu duvar atti. Cigliklar yardim cigliklari… UserService tabi ki singleon, baska yerlerde de kullaninca unsubscripe olmayan kardesimiz tekrar tekrar calisiyor.

Çözüm

// Http istegi yapan basit bir service file
this.userService.get()
      .pipe(take(1)) // Çözüm
      .subscribe(user => {
      if (window.isCordovaApp) {
        this.cordovaInAppBrowserService.open(lmsUrl);
      } else {
        window.open(user.lmsUrl, '_blank');
      }
    });

Take(1) kardeşimiz kodun logic uygun olarak bir kez veri gelince kendini dispose eder. Severiz, Kullanırız. Öneririz. Tabi Hem memoryleak hem de sorun çözüldü.

KAMU SPOTU

Best Practiseler boşuna değil, sevin kullanın. İşin sonunda bir ara yaparız demeyiniz. Bu iki günde ne featurelar geliştirilirdi. Clean code dostunuzdur. Best practise checklistleri okuyun, uygulayin. Ben bilmiyor muydum ? biliyordum ama zaten kodun olduğu yere geldim redirect değiştirdim, cünkü çalışıyordur dedim. (biraz önceki yazılımcıyı suçlar gibi oldu)

Tekrarlıyorum. Sonarcube, linter, code review dostunuzdur. Onlari bugunden surecinizin parcasi yapin. Ertelemeyin. ilk günden kuralları koyun ve uyun. Acele ederken daha cok zaman kaybediyoruz. Kodunuz temiz buglarınız az olsun.

Kaynak: https://www.umityildirim.com/hayir-tesekkurler-cok-mesguluz/

Okuduğunuz için teşekkürler.

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir