Neden bir Javascript uygulama çatısı? – AngularJs nedir? – AngularJs'in sundukları



Neden bir Javascript uygulama çatısı? – AngularJs nedir? – AngularJs'in sundukları

0 1


angularjs-sunum

Google'ın AngularJs'i - Özgür Web Teknolojileri Günleri 2013

On Github destan / angularjs-sunum

Google'ın AngularJs'i

Notlar

Ben kimim?

Destan Sarpkaya @ KodGemisi

  • Yeditepe Üniversitesi Bilgisayar Mühendisliği (2011)
  • Kurumsal firmalarda enterprise Java geliştirmesi
  • Özgür yazılım gönüllüsü
3:00
Önce kendimi tanıtayım.
  • Ben Destan Sarpkaya, bu yaz İstanbul'dan kaçarak İzmir'de KodGemisi adında bir yazılım firması kurduk.
  • Yeditepe'den 2011 yılında mezun oldum.
  • İstanbul'dayken iş hayatında hep enterprise Java yazdım ama "büyük" kurumsal firmalarda "ön yüz geliştirici" kavramı pek olmadığından javascript ile de tanıştım.
  • İşten arta kalan vakitte başka teknolojiler öğrenme merakıyla projeler geliştirdim. Bunların tamamı özgür yazılım projeleridir.
  • Özellikle üniversite döneminde özgür yazılım etkinlikleri düzenlenmesinde rol aldım.
  • ÖWTG, YUCOMP ve LKD'nin ortak çabası ile hazırlanmış bir etkinliktir. 2010 yılında ÖWTG'yi ilk kez hazırlayan ekipte etkin rol aldım.
  • O zamanlar bu etkinlikte sunum yapmak çok uzak bir olasılık olarak görünüyordu ama zamanla o gün geldi çattı.

Sunuma Genel Bakış

  • AngularJs nedir, neden gereklidir?
  • AngularJs'in sundukları
  • MVC kavramının uygulanışı
  • DOM etkileşimi
  • Testler
  • Sık yapılan hatalar
3:10
  • Sunum boyunca bu ana başlıklara değinerek AngularJs hakkında genel bir kanı oluşturmaya çalışacağım.

Neden bir Javascript uygulama çatısı?

3:30

Öncelikle neden bir Javascript uygulama çatısına gereksinim var ondan bahsedelim.

jQuery neyimize yetmiyor?

Neden bir Javascript uygulama çatısı?

  • İstemci-sunucu mimarisinin yaygınlaşması
  • Tek sayfa uygulamalar (Single page apps)
  • Daha büyük, karmaşık javascript kodları
4:00
  • İstemci tarafındaki (son kullanıcı bilgisayarları ve akıllı telefonlar), donanımsal gelişme ile hesaplama gücü önemli ölçüde arttı.
  • Business logic denilen hesaplamaların bir kısmı artık istemciler üzerinde yapılmaya başlandı.
  • Kullanıcı etkileşimi arttı.
  • Web siteleri artık web sitesinden çok birer uygulama olarak geliştiriliyor.
  • Kullanıcı deneyimini geliştiren tek sayfa uygulamalar yaygınlaştı.
  • Sonuçta artık elimizde daha büyük ve karmaşık kod tabanları var.

Teknik kısıt yok ama ...

Verimlilik ve sürdürülebilirlik önemli

“İnsanlar için kod yazın, makinalar için değil.”
5:00
  • On binlerce satırlık devasa ve karmaşık tek sayfa uygulamaları yazmak için teknik bir kısıt yok. jQuery ile hatta ev yapımı kütüphanelerle bile kesinlikle yapılabilir.
  • Ancak bu uygulamaların "çalışması" yeterli değil.
  • Geliştirme sürecinde hem bir çok tekerlek icad edeceksiniz hem de ekibiniz dışındaki birini işe alınca o devasa sistemin kendi standartlarını öğrenmesi uzun sürecek.
  • İnsanlar için kod yazmak gerek makinalar için değil.
uygulama çatısı = standart + hazır çözümler
6:00
Bu nedenle bir uygulama çatısı size en genel anlamıyla standart ve hazır çözümler sağlayacak.
  • Gerek düşünce tarzında gerek teknik konularda kod tabanınızın bir standartı olacak.
  • Dünyanın çoktan çözdüğü sorunları yeniden çözmeye zaman harcamayacaksınız.

AngularJs nedir?

AngularJs nedir?

  • Bir javascript uygulama çatısı
  • MVC tasarım deseni kullanır
  • MIT lisanslı
6:30
AngularJs nedir?
  • AngularJs bir uygulama çatısıdır.
  • MVC tasarım desenini kullanır, bu konu aslında tartışmalı, birazdan değineceğim.
  • Günün anlam ve önemine uygun olarak MIT lisansı ile sunulmuş.

AngularJs kafası

  • HTML statik ancak artık dinamik olmalı
  • Declarative UI
  • Modüler geliştirme ve yeniden kullanılabilirlik
  • Kaygıları ayırarak daha temiz modelleme
7:30
  • AngularJs'in diğer alternatiflerinden ayrıldığı nokta şu: Diğerleri sadece bir js uyg. çatısı sunarken AngularJs HTMLin davranışını değiştirmeyi hedefliyor.
  • Declarative UI
  • Modüler geliştirme yazılımın her alanında çok önemli çünkü yeniden kullanılabilirliği artırıyor.
  • Kaygıları ayırmak yani separation of concerns, iyi bir tasarımın başlıca göstergelerinden biri olan "loose coupling"i sağlar.

Dinamik HTML

8:00
  • jQuery ile yapsaydık?
  • Declarative. Imperative değil.

Dinamik HTML

function ProfileCtrl($scope) {
  $scope.reset = function() {
    $scope.user = {};
  };

  $scope.getUser = function() {
    $scope.user = {...};
  }
}
<div ng-app="">
  <div class="well" ng-controller="ProfileCtrl">
    <button class="btn" ng-click="getUser()">Kullanıcıyı getir</button>
    <button class="btn" ng-click="reset()">Reset</button>
    <div ng-if="!user.skills">Bir şey yok...</div>
    <ul class="well" ng-if="user.skills">
      <li ng-repeat="skill in user.skills" class="{{skill.type}}">{{skill.name}}</li>
    </ul>
  </div>
</div>
9:00
  • Declarative. Imperative değil.
  • Sunucu tarafındaki viewler tadında.
  • DOMa müdehale yerine daha çok model ile muhattabız.

MVC nedir?

  • Model View Controller
  • Kaygıların ayrılması (separation of concerns)
  • Günümüzde servis katmanı eklenmiş
9:30
  • MVCnin ne olduğundan ayrıntılı bahsetmeyeceğim çoğunuz biliyoruzdur muhtemelen.
  • Kaç kişi biliyor?
  • Kaygıların ayrılması için yardımcı olur.
  • Günümüzdeki pratiklerde controllerları destekleyen servis katmanları da kullanılmaktadır.

Angular'da MVC

  • MVVM -> Model View View-Model
  • View-Model -> $scope
  • MVW -> Model View Whatever
10:00
Referans: https://plus.google.com/+AngularJS/posts/aZNVhj355G2
  • AngualarJs'in MVC kavramı biraz tartışmalı. Çok kısa bu tartışmadan bahsedeyim.
  • AngularJs'in yaratıcıları başta MVC olduğunu ancak artık daha çok MVVM yapısında olduğunu söylemişlerdi.
  • Bunun üzerine dönen uzun ve anlamsız tartışmalar sonucu yine AngularJs'in yaratıcılarından biri "böyle gereksiz tartışmalar yapmayın MVW diyin geçin" dedi.

MVC

10:30
  • Bu klasik bir MVC gösterimidir.
  • AngularJs'te Model yerinde $scope düşünülebilir.
  • Bu nedenle MVVM deniliyor.

AngularJs'in sundukları

10:40
Artık AngularJs'in özelliklerinden bahsedelim.

AngularJs neleri çözmez?

  • Spagetti kod
  • Performans sorunları
  • SEO
11:00
Ama önce yanlış bir algı yaratılmadığından emin olmak için şunları vurgulamak isterim. AngularJs bunlara bir çözüm sunmuyor. Bunların çözümü sizde.
  • Spagetti kod
  • Performans sorunları
  • SEO

İki Yönlü Veri Bağlama

<div ng-app="">
  <div class="well">
    <label>Ad:</label>
    <input class="form-control" type="text" ng-model="adiniz" placeholder="Adınızı yazın">
    <h1>Selam {{adiniz}}!</h1>
  </div>
</div>
12:00
  • Şimdi bunun neresi 2 yönlü diyeceksiniz?
  • Veri inputtan scope'a bağlanıyor sonra scopetan div içine bağlanıyor.
  • Yani veri controllerda da viewda da aynı anda kullanılabilir oluyor.

Module kavramı

<div ng-app="myApp">
    ...
  </div>
angular.module('myApp', ['ngResource', 'videoPlayer'])
12:30
  • Constant, service, controller, directive eklenebilir.
  • Yeniden kullnılabilir parçalar yaratmaya yarar.
  • Bootstrap, select2 gibi kütüphanelerin AngularJs versiyonları modül olarak yazılmış.

Dependency Injection

angular.module('myApp', ['ngResource', 'videoPlayer'])

  .constant('ENDPOINT', 'https://api.kodgemisi.com/v2/')

  .factory('UserSyncService', ['$scope', 'ENDPOINT', function($scope, ENDPOINT){
    ...
  }])

  .controller('ProfileCtrl', ['$scope', 'UserSyncService', function($scope, userSyncService){
    ...
  }])
14:00
  • Minify sorunları

Scope kavramı

  • Prototypical inheritance
<div ng-app="">
  <div>
    <input type="text" ng-model="data">
    <h3>Root scope: {{data}}</h3>
  </div>
  
  <div ng-controller="FirstCtrl">
    <input type="text" ng-model="data">
    <h3>1. Controller: {{data}}</h3>
  </div>
  
  <div ng-controller="SecondCtrl">
    <input type="text" ng-model="data">
    <h3>2. Controller: {{data}}</h3>
  </div>
</div>
14:30
  • Böyle bir yapımız olduğunu düşünelim.
  • Her controller yeni bir child scope oluşturur.

Scope kavramı

  • Prototypical inheritance
16:00
  • Sırayla değer girin
  • Burada prototypical inheritance nasıl çalışır diye anlatmayacağım.
  • Yalnıca böyle bir şey var haberiniz olsun :)

AngularJs'in MVC kullanımı

Model

  • Model inputtan veya AJAXtan gelir
  • $scopea konulur
  • Model üzerindeki değişiklikler izlenir
16:30

View

  • HTML + Template
  • {{ }} ng-bind ng-model
  • String interpolation
17:00
  • String interpolation bir çok dilde olan bir özellik.
  • Bir string içindeki değişkenin, değişkenin değeriyle değiştirilmesidir.
  • Önceki örnekte görmüştük: Selam {{adiniz}} demiştik.

Controller

  • ViewModeli manipule eder
  • DOM'a kesinlikle dokunmaz
  • Her controllerın yeni "scope"u vardır
  • Controller inheritance YOK!
19:00
  • ViewModel dediğimiz ne burda? $scope
  • Her controllerın yeni "scope"u vardır
  • Chennemde yanarsınız

DOM etkileşimi ve directive kavramı

Directive

  • DOM ile etkileşimin tek yolu
  • ng-repeat ng-if ng-class ng-Bind
  • Özelleştirilebilir, kendi directive'lerinizi yazın
21:00

Directive örneği

angular.module('SampleForDirective', [])
  .directive('toggle', function() {
    return function(scope, element, attrs) {
      element.addClass('btn-success').text('Açık');
      var on = true;

      element.on('click', function() {
        if(on)
          element.removeClass('btn-success').addClass('btn-danger').text('Kapalı');
        else
          element.removeClass('btn-danger').addClass('btn-success').text('Açık');

        on = !on;
      });
    };
  });
<button class="btn" toggle=""></button>
25:00

Directiveler her yerde

  • Tag Attribute Class
<button class="btn" toggle=""></button>

<button class="btn toggle"></button>

<toggle></toggle>
25:30

AngularJs ve testler

27:00
  • Hepimiz test driven development yapıyoruz değil mi?
  • Test yazmayan kendini bilmez var mı aramız da?
  • Hepimiz test yazıyoruz tabiki...
  • İnş cnm yhaa
  • Testler, ülkemizin kanayan yarası.
  • Refactoring yapacağınız zaman çoook önemli.

Jasmine

describe('Test showcase', function() {
 
  describe('ProfileCtrl', function(){
 
    it('should instantiate "users" model with 2 users', function() {
      var scope = {};
      var ctrl = new ProfileCtrl(scope);
 
      expect(scope.users.length).toBe(2);
    });
  });
});
$ karma start karma-config.js 
INFO [karma]: Karma v0.10.5 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chromium 30.0.1599 (Ubuntu)]: Connected on socket GzV3EwULE_yqFCU5elUh
Chromium 30.0.1599 (Ubuntu): Executed 1 of 1 SUCCESS (0.14 secs / 0.023 secs)
Chromium 30.0.1599 (Ubuntu) Test showcase ProfileCtrl should instantiate "users" model with 2 users FAILED
  Expected 0 to be 2.
  Error: Expected 0 to be 2.
      at null.<anonymous> (/home/destan/dev/...samples/tests.js:9:34)
            </anonymous>
27:30

Sık yapılan hatalar

DOMa directive dışında müdahale

  • Directive kullanın
  • Controller doğru yer değil
  • Testlerde zorluk

Angular'a dışarıdan müdehale

$.get('http://api.kodgemisi.com/v2/user/35', function(data) {
  $scope.user = data;
});
$.get('http://api.kodgemisi.com/v2/user/35', function(data) {
  $scope.$apply(function(){
    $scope.user = data;
  });
});
$http('http://api.kodgemisi.com/v2/user/35')
.success(function(data, status) {
  $scope.user = data;
})

Build-in fonksiyonları kullanın

angular.copy angular.element angular.equals angular.extend angular.forEach angular.fromJson angular.identity angular.isArray angular.isDate angular.isDefined angular.isElement angular.isFunction angular.isNumber angular.isObject angular.isString angular.isUndefined angular.lowercase angular.noop angular.toJson angular.uppercase

{{Bunlar çıkmasın}}

<div>{{user.name}}</div>
<div ng-bind="user.name"></div>

Düşünce tarzınızı değiştirin

  • DOMu değiştirme, modeli değiştir
  • Web sitesi değil, bir uygulama
  • Önce mimari tasarlanır
  • Klasör yapısı ve modül yapısı tasarlanır
  • DOMu değiştirme, modeli değiştir
  • Web sitesi değil, bir uygulama
  • Önce mimari tasarlanır
  • Klasör yapısı ve modül yapısı tasarlanır

Teşekkürler

Sorular?