Verilerin Dili: Ekonomiyi Nasıl Okumalıyız? Verilerin Dili: Ekonomiyi ...
BBS515 – Nesneye Yönelik Programlamagonenc/courses/BBS515/... · 2019-03-01 · Java Java dili...
Transcript of BBS515 – Nesneye Yönelik Programlamagonenc/courses/BBS515/... · 2019-03-01 · Java Java dili...
BBS515 – Nesneye Yönelik ProgramlamaDers 1: Programlamaya Giriş
05.10.2016
Gönenç Ercan
Dersin Amacı►Bu derste temel programlama yeteneklerimizi geliştirmeye çalışacağız►Nesne yönelimli programlamanın temellerini Java programlama dilini
kullanarak öğreneceğiz►Önceliğimiz programlama yapabilmeyi öğrenmek üstüne olacak►Nesnesel tasarım ile ilgili BBS656 gibi derslerin alt yapısını
oluşturacağız.►Programlamaya yeni veya alt seviyeden başlayanlar için, BBS514 dersini
aynı zamanda alanlar için ilk haftalarda yapısal programlamatekniklerini Java ile yapmayı öğreneceğiz.
Notlandırma
►Ara sınav %30► Final %50►Ödevler %20
►Geçme notunuz 55. ►Derslere düzenli olarak katılmanızı beklemekteyim.
Ödevler
►Toplam 5 programlama ödeviniz olacak►Bu ödevlerden en iyi not aldığınız 4 tanesi puanlandırılacak►Programlama derslerinde teorik bir bilgiden çok pratik bir yetenek
kazandığınız için program yazıyor olmanız çok önemli►Mutlaka ödevlerinizi yapmaya çalışın, sınavdaki başarınızı da bu
sağlayacaktır►Ödevlerinizle ilgili takıldığınızda email ile soru sorabilirsiniz,
arkadaşlarınızla fikir alışverişi yapabilirsiniz. Ama ödevi son olarak sizinkodlamanız ve üretmeniz gerekmektedir.
►Ofis saatim Çarşamba günleri 16:00-18:00 arasıdır.
Sınavlar
► Sınav soru çeşitleri► Program yazma (%50)► Program takip etme (%30)► Programın hatasını düzeltme (%20)
►Bu soruları çözmenin en kolay yolu, çok pratik yapmaktır► Sınıfta bazı problemlerin kodunu yazacağız, mutlaka bunları kendiniz de
yazmaya çalışın
Dersin sayfası
►Ders notları, ödevler ve sınav sonuçları dersin web sayfasındayayınlacak
►Bu sayfayı haftada bir kere kontrol etmeye dikkat edin
http://gonencercan.com/courses/bbs515/
Bilgisayar MimarisiTemel bilgiler
Bilgisayarın donanımı (Von Neumman Mimarisi)
►Von Neumann Mimarisi: Temel olarak birişlemci, hafıza birimi, Girdi/Çıktı ünitelerindenoluşur
► İşlemci iki kısımdan oluşur, kontrol ünitesi veALU.
► İşlemci çalıştıracağı komutu yükler, komutlaragöre yapılacak işlem belirlenir
►ALU’da bu işlem için gerekli olandüzenlemeler yapılır
►Hafıza’dan bilgi yüklenmesi gerekirse yüklenirve çalıştırılır.
Bilgisayar donanımı
►Bu donanım yapısı hala geçerlidir, komutların hafızadan (veya girdi) yüklenebiliyor olması bilgisayarın faydasını arttırmaktadır
►Bir bilgisayarın işe yarayan bir işlem yapabilmesi için komutlara ihtiyacivardır
►Bu komutlar ve aslında bütün veriler ikili sayı sistemi ilesaklanmaktadır
►Her bir bit 0 veya 1 değerini alabilir
Verilerin gösterimi
►Komut: add $r1, $r2 àbit kodu ile 00101101 bir bit dizisine çevirilir. Her bir bit ALU’yu işleme göre düzenlemeye yarar
► Sayılar: Bir tamsayının 2’lik sisteme çevirilmesi ile gösterim yapılır. Bu sistemden ufak bir fark + ve – yi gösterebilmek için birinci bit kullanılır► 7 = 0000 0111
►Metin veri: Karakterlerin herbiri ASCII tablosu dediğimiz tablo ilesayılara haritalanmaktadır. A = 65 = 01000001 gibi.
►Herhangi bir anda bilgisayarın hafızasını düşündüğümüzde tüm göreceğimiz uzun bir bit dizisi olacaktır.
Turing Makinası
►Alan Turing programlamanın temelini oluşturan bir model önermiştir►Bu model bir teyp üstünden veri okuyabilen bir okuyucu/yazıcı kafa ile
tanımlanmaktaydı►Aslında amaç insanların nasıl hesaplama yapabildiğini açıklamaya
yönelikti►Örnek problem verilen bir bit serisi 111100 acaba 1n0n yapısında mı? ►Bu model ile günümüzdeki bütün programları yazmak mümkündür►Peki bu kadar basit bir yöntem hepsini tanımlayabilirken programlama
dillerine neden ihtiyaç duyuyoruz
Programlama Dili Seviyeleri
►Bilgisayarın gerçekte işlettiği komutlar aslında birer bit dizisi►Bu bit dizisini bir insanın anlaması çok zor►Düşük seviyeli bir dil bit dizisine en yakın dildir►Assembly dili düşük seviyeli bir dildir, yukarıda assmebly ve karşılık
gelen C kodu gösterilmektedir. ►C assembly’e göre daha üst seviye bir dildir.
movl $5, -4(%rbp) movl -4(%rbp), %eaxaddl $1,%eax movl %eax, -4(%rbp)
int i = 5; i += 1;
Programlama Dil Seviyeleri
►Düşük seviye programlama dili► Makina diline yakın► En ufak detaya kadar belirtmemiz gerek► Anlaması zor
►Üst seviye programlama dili► Anlaması daha kolay► Ara adımları derleyiciler bizim için yapıyor► Büyük projeleri yönetmek daha kolay
Programlama Paradigmaları►Programları nasıl yapılandıracağımızı ve düşünme yöntemimizi belirler►Bazı paradigmalar
► Yapısal Programlama (C, Pascal, Basic)► Nesne yönelimli (C++, Python, Java)► Fonksiyonel (Haskell, Scala)► Buyurgan (Imperative)► Bildirimsel (Declarative): SQL gibi
Yazılım Karmaşıklığı
►Yazılımlar genel olarak geniş kapsamlı oluyor► Sadece bir kişinin bütün detaylarına hakim olması mümkün olmuyor►Bir insan aynı anda 7 (artı eksi 2) kavramı takip edebilmektedir►Bu yüzden bir kişinin geniş kapsamlı bir projede alabileceği ideal rol de
kısıtlıdır►Bir problemi bir bütün olarak çözmek yerine parçalara bölerek
çözmeye çalışıyoruz (divide&conquer)►Bir bilgisayar sisteminde CPU ayrı yapılır, CPU’nun içindeki devreler
ayrı tasarlanır. Bu parçalara bölme sayesinde sistemigerçekleştirebiliyoruz
Parçala-Yönet►Parçala yönet taktiğini kullanmak için verilen bir işi parçalara
bölmemiz gerekmektedir►Bir projeyi alt işlere bölümlemek çok önemlidir►Yapısal programlamada yapılması gereken algoritmalar üstünden bir
bölümleme söz konusudur.►Nesne yönelimli yazılım ise gerçek dünyaya daha yakın olarak
düşünebileceğimiz nesneler ve onların ilişkileri üstünden işibölümlemimize olanak sağlar
Algoritmik bölümleme
CHAPTER 1 COMPLEXITY 19
The Role of Decomposition
“The technique of mastering complexity has been known since ancient times: divide et impera (divide and rule)” [16]. When designing a complex software sys-tem, it is essential to decompose it into smaller and smaller parts, each of which we may then refine independently. In this manner, we satisfy the very real con-straint that exists on the channel capacity of human cognition: To understand any given level of a system, we need only comprehend a few parts (rather than all parts) at once. Indeed, as Parnas observes, intelligent decomposition directly addresses the inherent complexity of software by forcing a division of a system’s state space [17].
Algorithmic Decomposition
Most of us have been formally trained in the dogma of top-down structured design, and so we approach decomposition as a simple matter of algorithmic decomposition, wherein each module in the system denotes a major step in some overall process. Figure 1–3 is an example of one of the products of structured design, a structure chart that shows the relationships among various functional elements of the solution. This particular structure chart illustrates part of the design of a program that updates the content of a master file. It was automatically generated from a data flow diagram by an expert system tool that embodies the rules of structured design [18].
Figure 1–3 Algorithmic Decomposition
Get masterarea
Get formattedupdate
Match Update Put unmatchedmaster
Put formattedmaster
Get old masterrecord
Validatechecksum
Edit Get sequencedcard
Get updatecard
Seqcheck
Addchecksum
Put newmaster record
Formatoutput
Updatefile
ReformatGet validcare
ExpandGet OKmaster
Put newmaster area
Grady Booch et al. Object Oriented Analysis and Design. Addison Weisley
Nesne Yönelimli Bölümleme
20 SECTION I CONCEPTS
Object-Oriented Decomposition
We suggest that there is an alternate decomposition possible for the same prob-lem. In Figure 1–4, we have decomposed the system according to the key abstrac-tions in the problem domain. Rather than decomposing the problem into steps such as Get formatted update and Add checksum, we have identified objects such as Master File and Checksum, which derive directly from the vocabulary of the prob-lem domain.
Although both designs solve the same problem, they do so in quite different ways. In this second decomposition, we view the world as a set of autonomous agents that collaborate to perform some higher-level behavior. Get Formatted Updatethus does not exist as an independent algorithm; rather, it is an operation associ-ated with the object File of Updates. Calling this operation creates another object, Update to Card. In this manner, each object in our solution embodies its own unique behavior, and each one models some object in the real world. From this perspective, an object is simply a tangible entity that exhibits some well-defined behavior. Objects do things, and we ask them to perform what they do by sending them messages. Because our decomposition is based on objects and not algo-rithms, we call this an object-oriented decomposition.
Algorithmic versus Object-Oriented Decomposition
Which is the right way to decompose a complex system—by algorithms or by objects? Actually, this is a trick question because the right answer is that both views are important: The algorithmic view highlights the ordering of events, and the object-oriented view emphasizes the agents that either cause action or are the subjects on which these operations act.
Figure 1–4 Object-Oriented Decomposition
Update toCard
File ofUpdates
Checksum
MasterRecord
Master File
UpdateGet Formatted Update
Get Put Create
Is Valid Add
Get ReformatMatch
Sınıf Listesi
►Örnek bir problem üstünden iki paradigmayı karşılaştıralım►Bir sınıftaki öğrencilerin dersten sonra gidecekleri başka bir ders daha
var. Bu dersin yerini öğrenciler bilmiyor. ►Probleme Yapısal programlama ile çözüm
► Derse gelen her öğrencinin► Adını al, ► Bir sonraki dersini bul► Kampüs haritasından dersin sınıfını bul► Öğrenciye tarif et
► Nesne yönelimli çözüm► Öğrencilerin derslerinin ve sınıflarının listesini koy► Haritada sınıfları işaretleyip sınıfa as
Sorumluluk kavramı
►Nesnelerin belirli sorumlulukları var►Bu iletişimi kolaylaştırıyor.
► Harita nesnesi, neleri içermesi gerektiği ve görevi tanımlı► Satır olarak kod üstünden anlatmak yerine daha kolay
► Soyutlaştırma► Bir nesneyi gerçekleştirdiğimizde artık geriye dönüp kodlarını incelememize
gerek kalmaz► Bütün olarak kullanabileceğimiz bir araca dönüşür
►Bilgi saklama► Sadece kendi yapmamız gereken kısma odaklanabiliriz
Nesne►Verisi (özellikleri) olan. Değişkenler►Davranışı olan. Fonksiyonlar►Kendi durumunu belirleyen özellikleri ile davranışını belirleyen
metodlar ile değiştiren bir yazılım aracı►Herhangi soyut, somut varlık nesne olarak tasarlanabilir
► Fiziksel varlık: Araba, Öğrenci► Kavramsal varlık: EFT, Toplantı► Yazılımsal varlık: Yığıt, Liste, Küme
Java
► Java dili James Gosling tarafından 1995 yılında üretilmiş birprogramlama dili ve platformdur
► Java sanal makina üstünde çalışan bir dildir. ►Yukarıda bir programın normal geliştirme süreci gösterilmiştir (Örnek
C++ programı)►Bu işleyiş Java için farklıdır sanal makina’da çalışacak kod üretilir
Compiler Source File Machine-language
File Linker Executable File
Library Code
Neden Java►Nesne yönelimli programlama kurallarının en net olduğu dillerdendir►Bu özelliği ile büyük kurumsal projelerde kullanılmaktadır► İşletim sistemi ve donanım bağımsızdır► Internet sayfaları üstünden çalıştırılabilir►Gömülü sistemlerde kullanılmaktadır►Cep telefonlarında kullanılmaktadır (Android)►En önemlisi kuralları ve yapısı sayesinde karmaşık projelerde anlaşılır
ve takip edilebilir bir yapısı bulunmaktadır
Java versiyonları► Java Standard Edition J2SE: Derste kullanacağımız temel sürüm. İndirip
yüklemeniz gerekiyor.► Java Enterprise Edition J2EE: Kurumsal projeler için kullanılan platform.
Kurumsal uygulamalarda bulunan Web servis, Enterprise Java Beans gibi araçları barındırır.
► Java Mobile Edition J2ME: Eski nesil cep telefonu uygulamaları için
IDE (Integrated Development Environment)►Program yazarken kullanabileceğiniz bir arayüz►Hata yapmanızı engelleyecek üretkenliğinizi arttırabilecek araçlar içerir►Eclipse Standard Edition*►Netbeans► Intellij IDEA
İlk Java programımız!
►Yukarıdaki kodu herhangi bir text editörü ile Welcome.java adında birdosyaya yazın.
►Windows’da notepad ile yazabilirsiniz
//This program prints Welcome to Java! public class Welcome {
public static void main(String[] args) { System.out.println("Welcome to Java!");
}}
Programın derlenmesi ve çalıştırılması►Programı derlemek için javac komutunu kullanacağız►Bilgisayarınıza Java Development Kit yükledikten sonra “Komut istemi”
(Command Prompt) açıp derleyebilirsiniz► Başlangıç menüsünden (Start Menu) à Çalıştır (Run) à cmd.exe
►Açılan siyah ekrana:► javac Welcome.java
►Yazdığımızda Welcome.class dosyası oluşacaktır. Bu dosyaprogramımızın Bytecode cinsinden derlenmiş hali.
► Sanal makinada class dosyaları çalıştırılabilir. Bunun için► java Welcome
28
Programı Derleme ve Çalıştırma
Source Code
Create/Modify Source Code
Compile Source Code i.e., javac Welcome.java
Bytecode
Run Byteode i.e., java Welcome
Result
If compilation errors
If runtime errors or incorrect result
public class Welcome { public static void main(String[] args) { System.out.println("Welcome to Java!"); } }
… Method Welcome() 0 aload_0 … Method void main(java.lang.String[]) 0 getstatic #2 … 3 ldc #3 <String "Welcome to Java!"> 5 invokevirtual #4 … 8 return
Saved on the disk
stored on the disk
Source code (developed by the programmer)
Byte code (generated by the compiler for JVM to read and interpret, not for you to understand)
Program çalışması
29
//This program prints Welcome to Java! public class Welcome {
public static void main(String[] args) { System.out.println("Welcome to Java!");
}}
Enter main method
30
//This program prints Welcome to Java! public class Welcome {
public static void main(String[] args) { System.out.println("Welcome to Java!");
}}
Program ÇalışmasıExecute statement
31
//This program prints Welcome to Java! public class Welcome {
public static void main(String[] args) { System.out.println("Welcome to Java!");
}}
Program Çalışması
EkranaWelcome to Java yazdırlacaktır
Eclipse ile Program Derleme
► Sınıfta demosu yapılacaktır
Java Programlarının Anatomisi
►Yorum satırları►Anahtar kelimeler (Reserved Words)►Modifiers► İfadeler►Bloklar► Sınıflar►Metodlar►Main metod
Yorum satırları
►Bir programın içinde kendinize veya başka programcılara yardımcıolacak yorumlar ekleyebilirsiniz
► // bir satırı yorum olarak işaretler► /* Yorum */ Paragraf yorum, /* ile başlayıp */ ile biten kısımları yorum
olarak işaretler► Javadoc yorumları: Metod ve sınıf önlerine konulan özel yorumlardır.
Java dokümantasyonlarında gözükür. Diğerlerine oranla bu yorumtipini tercih etmeniz iyi bir pratiktir
Anahtar kelimeler
► Java dilinde özel işlevleri olan kelimeler listesidir. ►Eclipse IDE gibi araçlar farklı renk ile gösterilir. Bu kelimeleri başka
amaçlarla kullanamazsınız
Modifiers► Java’da tanımlanan bir sınıfın, metodun veya özelliğin nasıl
kullanabileceğini belirtmeye yarar. ►Önümüzdeki derslerde daha detaylı olarak göreceğiz►Temel olarak tanımlardan önce görülürler
İfadeler►Bir ifadeyi doğal dildeki cümle olarak düşünebilirsiniz► İşlenebilecek bir komutu ifade ederler►Tek satırlı ifadeler “;” ile sonlandırılır. Bunu cümle sonunda kullanılan
“.” işareti gibi düşünebilirsiniz►Tıpkı cümleler gibi ifadenin bir anlamı olması gerekir
Bloklar
public class Test { public static void main(String[] args) { System.out.println("Welcome to Java!"); } }
Class block
Method block
Sınıflar
► Java’da bir kod mutlaka bir sınıfın içinde tanımlanmalıdır. ►Bu yüzden bütün programlar bir sınıf bloğu içerir► Sınıfların ne olduğunu daha sonraki derslerde göreceğiz
Metodlar► System.out.println() gibi çağırılabilen bir dizi işlemdir. Bu durumda
verilen mesaji ekrana yazdır demiş oluyoruz►Kendi metodlarımızı tanımlamayı da göreceğiz, bu sayede problemleri
daha küçük parçalara ayırma şansımız olacak
Main metodu
► Java’da çalıştırılabilen bütün programlar bir main metodu içermekzorundadır.
►Aslında bu bir metod tanımıdır, metodun imzası ve komutları
public static void main(String[] args) {// Statements;
}