Úvod do programování 5
DESCRIPTION
Objektově orientované programováníTRANSCRIPT
Úvod do programování aneb Do nitra stroje
Karel MinaříkPŘEDNÁŠKA 5
Úvod do programování
Opakování1
Úvod do programování Přednáška 5
ZÁKLADNÍ KONCEPTY
1. Datové typy: čísla, texty, pole, hashe; Přetypování
2. Proměnné a rozsah platnosti
3. Metody a funkce
4. Podmínky a logické operátory
5. Smyčky a iterátory
6. Výjimky — ošetření chyb
7. Vstup
8. Výstup
Úvod do programování Přednáška 5
require 'net/http'
server = 'www.lidovky.cz' # vs. www.neexistuje.cz nebo vytazeny sitovy kabel...
begin response, data = Net::HTTP.new(server).get('/')rescue Exception puts "Nemohu se připojit na server #{server}" # ...načteme data uložená na disku... # data = ...endputs data.to_s.scan( /<div class="art opener"><h3><a href=".+">(.*)<\/a><\/h3>/).to_s ) if data
vyjimky.rb
Úvod do programování Přednáška 5
require 'rubygems'require 'hpricot'require 'open-uri'require 'iconv'
server = 'http://www.lidovky.cz' # vs. www.neexistuje.cz nebo vytazeny sitovy kabel...
begin html = Hpricot( open(server) )rescue Exception puts "Nemohu se připojit na server #{server}..." exitend
titulek = html.search('div.art.opener h3 a').inner_html
puts Iconv.iconv( 'utf-8', 'windows-1250', titulek )
parsovani_html.rb
Úvod do programování Přednáška 5
require 'rubygems'require 'hpricot'require 'open-uri'require 'iconv'
server = 'http://www.lidovky.cz' # vs. www.neexistuje.cz nebo vytazeny sitovy kabel...
begin
html = Hpricot( open(server) )rescue Exception puts "Nemohu se připojit na server #{server}..." exitend
titulek = html.search('div.art.opener h3 a').inner_htmlputs Iconv.iconv( 'utf-8', 'windows-1250', titulek )
www.igvita.com/blog/2007/02/04/ruby-screen-scraper-in-60-seconds/
http://code.whytheluckystiff.net/hpricot/
parsovani_html.rb
Úvod do programování Přednáška 5
Když se Řehoř Samsa jednou ráno probudil z nepokojných snů, shledal, že se v posteli proměnil v jakýsi nestvůrný hmyz.
text = File.read 'kafka_promena.txt'
# ---> A ted neco trochu jineho... Najdeme nejpouzivanejsi slovo :)
words = text.tr('-,();\'"', '').split(' ')
current_word = words.sort.first
word_counts = {}word_counts[current_word] = {}
count = 0
words.sort.each do |word| if word == current_word count += 1 else count = 1 current_word = word end word_counts[word] = {:word => word, :count => count}end
nejpouzivanejsi = word_counts.sort.first # "Nejvetsi = prvni" -- ["A", {:count=>37, :word=>"A"}]
puts "Začínáme s " + nejpouzivanejsi[1][:word].to_s + "."
word_counts.sort.each do |word| nejpouzivanejsi = word if word[1][:count] > nejpouzivanejsi[1][:count] end
puts "Nejpoužívanější slovo je „" + nejpouzivanejsi[1][:word] + "“ s " + nejpouzivanejsi[1][:count].to_s + " výskyty."
nejpouzivanejsi_slovo.rb
Úvod do programování Přednáška 5
Když se Řehoř Samsa jednou ráno probudil z nepokojných snů, shledal, že se v posteli proměnil v jakýsi nestvůrný hmyz.
text = File.read 'kafka_promena.txt'
# ---> ... a co seznam slov podle frekvence pouziti?
puts "Seznam nejpoužívanějších slov v Kafkově ‚Proměně‘:"
most_frequent_words = word_counts.values.collect { |word| [word[:count], word[:word]] }
most_frequent_words.sort.reverse.each_with_index do |word, i| puts "#{i+1}. #{word[1]}\t\t\t(#{word[0]} výskytů)"end
seznam_nejpouzivanejsich_slov.rb
Úvod do programování Přednáška 5
Když se Řehoř Samsa jednou ráno probudil z nepokojných snů, shledal, že se v posteli proměnil v jakýsi nestvůrný hmyz.
text = File.read 'kafka_promena.txt'
# ---> A ted neco trochu jineho... Najdeme nejpouzivanejsi slovo :)
words = text.tr('-,();\'"', '').split(' ')
current_word = words.sort.first
word_counts = {}word_counts[current_word] = {}
count = 0
words.sort.each do |word| if word == current_word count += 1 else count = 1 current_word = word end word_counts[word] = {:word => word, :count => count}end
nejpouzivanejsi = word_counts.sort.first # "Nejvetsi = prvni" -- ["A", {:count=>37, :word=>"A"}]
puts "Začínáme s " + nejpouzivanejsi[1][:word].to_s + "."
word_counts.sort.each do |word| nejpouzivanejsi = word if word[1][:count] > nejpouzivanejsi[1][:count] end
puts "Nejpoužívanější slovo je „" + nejpouzivanejsi[1][:word] + "“ s " + nejpouzivanejsi[1][:count].to_s + " výskyty."
nejpouzivanejsi_slovo.rb
1
2
3
4
Úvod do programování Přednáška 5
„Křehký kód“„Fragile code“
Úvod do programování
Objektově orientované programování2
Úvod do programování Přednáška 5
1. Nalít olej do pánve2. Zapálit plyn3. Vzít vejce4. Rozklepnout vejce o okraj pánve
Úvod do programování Přednáška 5
1. Nalít olej do pánve2. Zapálit plyn3. Vzít vejce, sůl a pepř4. Rozklepnout vejce o okraj pánve
Úvod do programování Přednáška 5
„Udržovatelnost“ software
Znovu-použitíRe-usability
Rozšiřitelnost
Úvod do programování Přednáška 5
Košík Produkty
Objednávky
Platby
Diskuse
Úvod do programování Přednáška 5
Košík Produkty
Objednávky
Platby
Diskuse
Customer.php
~500 řádků kódu
Úvod do programování Přednáška 5
Košík Produkty
Objednávky
Platby
Diskuse
Customer.php
~500 řádků kódu
Úvod do programování Přednáška 5
ZÁKLADNÍ KONCEPTY OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ (OOP)
1. Zapouzdření Encapsulation
2. Modulárnost Modularity
3. Dědičnost Inheritance
4. Rozhraní Interface
5. Abstraktnost Abstraction
6. Polymorfie Polymorfism
„Formičky“
Úvod do programování Přednáška 5
Zvíře
Pes Ovce
Úvod do programování Přednáška 5
1 require 'pp' 2 3 # *** ANIMALS ***************************************************************** 4 5 #-- file Animal.rb 6 class Animal 7 8 attr_accessor :name, :position, :color 9 10 def initialize(name) 11 @name = name 12 @position = 0 13 @stuff_in_belly = 0 14 @walk_increment = 1 15 @run_increment = 10 16 puts "Hello, I am a #{self.class.to_s.downcase} named #{self.name}!" 17 end 18 19 def talk 20 puts "#{self.class}: ..." 21 22 end 23
animals.rb
Úvod do programování Přednáška 5
24 def walk 25 @position += @walk_increment 26 end 27 28 def run 29 @position += @run_increment 30 end 31 32 def feed 33 @stuff_in_belly += 1 34 puts "[Chewing on some stuff and happy...]" 35 self.poop if @stuff_in_belly > 3 36 end 37 38 def hungry? 39 if @stuff_in_belly < 2 40 true 41 else 42 false 43 end 44 end 45
animals.rb
Úvod do programování Přednáška 5
46 protected 47 48 def poop 49 puts "[Too much stuff in belly... pooping...]" 50 @stuff_in_belly = 0 51 end 52 53 end 54 55
animals.rb
Úvod do programování Přednáška 5
56 #-- file Dog.rb 57 class Dog < Animal 58 59 def initialize(name, color) 60 super(name) 61 @color = color 62 @run_increment = 20 63 64 end 65 66 def talk 67 puts "#{self.name}: Woof! woof!" 68 end 69 70 def fetch(what='stick') 71 puts "[#{self.name} is fetching the #{what.downcase}...]" 72 end 73 74 end 75 76
animals.rb
Úvod do programování Přednáška 5
77 #-- file Sheep.rb 78 class Sheep < Animal 79 80 def talk 81 puts "#{self.name}: Beeeeee!" 82 end 83 84 end 85
animals.rb
Úvod do programování Přednáška 5
86 # === Dog ===================================================================== 87 88 # --- Create a dog 89 dog = Dog.new('Bitzer', 'yellow') 90 pp dog 91 92 # --- Dog's properties (attributes) 93 puts "Our dog's name is '#{dog.name}'." 94 puts "And his color is #{dog.color}." 95
animals.rb
Úvod do programování Přednáška 5
96 # --- Make the dog do something 97 puts "> Talk, Bitzer!" 98 dog.talk 99 100 puts "> Fetch, Bitzer!" 101 dog.fetch 102 dog.fetch('Ball') 103 104 puts "> Walk, Bitzer!" 105 dog.walk 106 puts "Dog is at position: #{dog.position}." 107 puts "> Run, Bitzer!" 108 dog.run 109 puts "Dog is at position: #{dog.position}." 110 111 puts "> Have a snack, Bitzer!" 112 dog.feed 113 puts dog.hungry? 114 115 dog.feed 116 dog.feed 117 puts dog.hungry? 118 119 # dog.poop 120 dog.feed 121 122
animals.rb
Úvod do programování Přednáška 5
123 puts "\n---\n\n" 124 # === Sheep =================================================================== 125 126 sheep = Sheep.new('Shaun') 127 pp sheep 128 129 sheep.talk 130 131 puts sheep.position 132 sheep.run 133 puts sheep.position 134 135 # sheep.fetch
animals.rb
Úvod do programování Přednáška 5
http://ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html
Úvod do programování Přednáška 5
DOMÁCÍ ÚKOL
Navrhněte a naprogramujte třídu TextAnalyzer
TextAnalyzer:• text• characters• words• pages• unique_words• most_frequent_words• most_frequent_word
Úvod do programování Přednáška 5
Návrhové vzoryDesign patterns
Úvod do programování Přednáška 5
PŘÍKLADNávrhový vzor ActiveRecord
ID Name Surname E-mail1 John Smith [email protected] Susanna Reddick [email protected]
tabulka people
INSERT INTO people (name, surname, email) VALUES( 'John', 'Smith', '[email protected]' );SELECT * FROM people;SELECT * FROM people WHERE id = 1;SELECT * FROM people WHERE surname = 'Smith';
# ActiveRecord::Base.establish_connection ..Person.create(:name => 'John', :surname => 'Smith', :email => '[email protected]')Person.find(:all)Person.find(1)Person.find_by_name('Smith')
Úvod do programování Přednáška 5
PŘÍKLADNávrhový vzor ActiveRecord
require 'rubygems'require_gem 'activerecord'require 'pp'
ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => 'active_record_test.db')ActiveRecord::Base.connection.execute('CREATE TABLE "people" ( id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(255), surname VARCHAR(255), email VARCHAR(255) )')
class Person < ActiveRecord::Baseend
Person.create( :name => 'John', :surname => 'Smith', :email => '[email protected]' )Person.create( :name => 'Susanna', :surname => 'Reddick', :email => '[email protected]' )
pp Person.find(:all)puts "\n"
pp Person.find(1)puts "\n"
pp Person.find_by_surname('Smith')puts "\n"
Úvod do programování Přednáška 5
MODELOVÁNÍUnified Modeling Language (UML)
Děkuji!