Permalink
Browse files

fix conflict

  • Loading branch information...
2 parents 5f1c22c + 43d2152 commit 85b393a1c44d6c6a00d32908b0c009c492cab170 @anggriawan anggriawan committed Apr 17, 2012
Showing with 58 additions and 27 deletions.
  1. +9 −12 Readme.md
  2. +1 −1 Session1.md
  3. +48 −14 Session3.md
View
@@ -11,20 +11,19 @@ install ruby dengan perintah `sudo apt-get install ruby`
## Session 1: Basic Ruby
* Ruby Overview
-* Console I/O
+* Menjalankan Ruby
+* Syntax dan Idiom
* Object-Oriented in Ruby: Classes, Attributes, Methods
* String Type and Operations
-* Numeric Types and Mathematical Expressions
-* Boolean Expressions
+* Numeric
+* Boolean
* Conditional Constructs
* Arrays
-* Loop Constructs
* Code Blocks
* Ranges
* Regular Expressions
* Symbols
* Hashes
-* Methods
## Session 2: OOP with Ruby
@@ -48,12 +47,10 @@ install ruby dengan perintah `sudo apt-get install ruby`
## Session 4: Testing
-* Unit Testing with Test::Unit
-* Leveraging Libraries
-* RubyForge and RubyGems
+* Libraries
+* Instalasi & Menggunakan Gems
+* Bundler
* Packaging Programs and Libraries for Distribution
+* Testing
+* Unit Testing with Minitest
* Introduction to TDD
-* Red-Green-Refactor
-* Describing a feature
-* Verifying expectations
-* Mocks & Stubs
View
@@ -23,7 +23,7 @@ Berikut ini adalah contoh program hello world di ruby:
puts "Hello world"
```
-## Menjalankan ruby
+## Menjalankan Ruby
Cara paling mudah untuk mencoba ruby adalah dengan menggunakan irb (interactive ruby).
View
@@ -51,7 +51,9 @@ end
hoo # => Exception: Negative number
```
-Selain menggunakan keyword `rescue` dan `raise`, kita bisa juga menggunakan method `catch` dan `throw` pada Ruby. Penggunaan argumen `catch` dan `throw` pada Ruby ini berbeda dengan di Java, meskipun namanya sama.
+Selain menggunakan keyword `rescue` dan `raise`, kita bisa juga menggunakan method `catch`
+dan `throw` pada Ruby. Penggunaan argumen `catch` dan `throw` pada Ruby ini berbeda
+dengan di Java, meskipun namanya sama.
```ruby
def print_me(n)
@@ -65,6 +67,8 @@ catch(:done) do
end
```
+Penggunaan `throw` dan `catch` di ruby sangat jarang dilakukan dan sebaiknya dihindari
+
## Advanced Blocks
### Implicit Block
@@ -106,7 +110,11 @@ end
Ruby memungkinkan kita menyimpan *procedure* atau `Proc` sebagai objek lengkap dengan konteksnya.
-Penggunaan *block* pada Ruby itu relatif sederhana. Meskipun demikian, kita mungkin perlu punya beberapa *block* yang berbeda dan menggunakannya berkali-kali. Untuk menghindari kode yang repetitif tersebut, kita bisa menyimpannya sebagai *procedure* atau `Proc`, sebagai objek yang lengkap dengan konteksnya. Perbedaan antara *block* dan `Proc` adalah *block* merupakan suatu `Proc` yang tidak bisa disimpan dan merupakan solusi sekali pakai.
+Penggunaan *block* pada Ruby itu relatif sederhana. Meskipun demikian,
+kita mungkin perlu punya beberapa *block* yang berbeda dan menggunakannya berkali-kali.
+Untuk menghindari kode yang repetitif tersebut, kita bisa menyimpannya sebagai *procedure*
+atau `Proc`, sebagai objek yang lengkap dengan konteksnya. Perbedaan antara *block* dan
+`Proc` adalah *block* merupakan suatu `Proc` yang tidak bisa disimpan dan merupakan solusi sekali pakai.
```ruby
def foo
@@ -132,7 +140,8 @@ foo # => counting - 12345
### Lambda
-Di Ruby, *lambda* merupakan suatu *method* yang menciptakan objek *Proc* yang terkait dengan konteks saat ini dan melakukan pengecekan parameter ketika dipanggil.
+Di Ruby, *lambda* merupakan suatu *method* yang menciptakan objek *Proc* yang terkait dengan konteks saat ini
+dan melakukan pengecekan parameter ketika dipanggil.
Berbeda dengan Proc, lambda akan mengecek jumlah argumen yang dioper.
@@ -161,28 +170,48 @@ end
## Classes as Objects
-*Object* merupakan *root* dari hierarki kelas di Ruby. Semua *method* dari kelas *Object* akan tersedia di seluruh kelas kecuali di-*override* secara eksplisit. Selengkapnya ada di http://www.ruby-doc.org/core/classes/Object.html
+*Object* merupakan *root* dari hierarki kelas di Ruby. Semua *method* dari kelas *Object* akan tersedia
+di seluruh kelas kecuali di-*override* secara eksplisit. Selengkapnya ada di http://www.ruby-doc.org/core/classes/Object.html
## Metaprogramming
-*Metaprogramming* merupakan pemrograman yang memanipulasi program lainnya atau bahkan dirinya sendiri, atau mengerjakan hal-hal yang biasanya dilakukan pada *compile time*, pada waktu *runtime*. Kemampuan suatu objek untuk memanipulasi dirinya sendiri ini sering disebut sebagai *reflection*.
+*Metaprogramming* merupakan pemrograman yang memanipulasi program lainnya atau bahkan dirinya sendiri,
+atau mengerjakan hal-hal yang biasanya dilakukan pada *compile time*, pada waktu *runtime*.
+Kemampuan suatu objek untuk memanipulasi dirinya sendiri ini sering disebut sebagai *reflection*.
+
+Metaprogramming di ruby memanfaatkan sifat ruby yang sangat dinamis. Beberapa teknik yang sering digunakan
+dalam metaprogramming di ruby antara lain:
### Monkey Patching
-Salah satu bentuk *metaprogramming* adalah *monkey patching*, yaitu memodifikasi *runtime code* dari suatu bahasa yang dinamis tanpa mengubah *source code* aslinya.
+Salah satu bentuk *metaprogramming* adalah *monkey patching*, yaitu memodifikasi *runtime code* dari suatu
+bahasa yang dinamis tanpa mengubah *source code* aslinya.
+
+Contoh yang sangat menarik dalam monkey patching di ruby adalah dengan melakukan overwrite kelas yang
+sudah didefinisikan sebelumnya, termasuk kelas yang built-in (bawaan) ruby seperti `Fixnum`.
+Kelas dalam ruby dapat dibuka dan didefinisikan ulang kapanpun kita mau. Dengan demikian kita dapat
+dengan mudah mengubah behaviour dari suatu object sesuai keinginan kita.
+
+Dibawah ini adalah contoh monkey patching yang sangat berbahaya. Di sini kita membuka kembali kelas `Fixnum`
+yang merupakan kelas bagi angka integer bawaan ruby. Kemudian kita mendefinisikan ulang method `+` untuk
+selalu me-return angka 42 kapanpun.
```ruby
-class Array
- def foo
- puts "Monkey patched!"
+class Fixnum
+ def +(x)
+ 42
end
end
-[ 1, 2, 3, 4, 5 ].foo # => Monkey patched!
+3 + 4 # => 42
```
-Kita juga bisa meng-*override* semua objek, misalnya dengan menambahkan timestamp.
+Kita bahkan juga bisa meng-*override* semua objek dengan cara meng-override kelas `Object` yang merupakan
+hirarki kelas tertinggi, sehingga semua objek akan terpengaruh.
+
+Contoh berikut ini menambahkan atribut timestamp bagi semua object, sehingga setiap object akan menyimpan
+waktu ketika object tersebut diinisiasi.
```ruby
class Object
@@ -206,16 +235,21 @@ Foo.new.timestamp
### method_missing
-Ketika kita mengirimkan pesan ke objek, objek akan mengeksekusi *method* pertama yang ditemukannya pada *method lookup path* dengan nama yang sama persis dengan pesan. Jika tidak ditemukan, ia akan melemparkan *exception* NoMethodError, kecuali kalau kita sudah menyediakan sebuah *method* bernama `method_missing`.
+Ketika kita mengirimkan pesan ke objek, objek akan mengeksekusi *method* pertama yang ditemukannya pada
+*method lookup path* dengan nama yang sama persis dengan pesan. Jika tidak ditemukan,
+ia akan melemparkan *exception* NoMethodError, kecuali kalau kita sudah menyediakan sebuah *method* bernama `method_missing`.
+
+`method_nissing` dapat kita override sesuai dengan keinginan kita. Misalnya kita dapat meng-override `method_missing`
+sehingga jika kita memanggil method yang tidak tersedia, object tersebut akan memberi kita peringatan.
```ruby
class Foo
def method_missing(m, *args, &block)
- puts "#{m} not found"
+ puts "method #{m} is not defined. Please define it first."
end
end
-Foo.new.bar # => bar not found
+Foo.new.bar # => method bar is not defined. Please define it first.
```
## I/O

0 comments on commit 85b393a

Please sign in to comment.