Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
nidabaser committed May 7, 2024
0 parents commit 838ef0d
Show file tree
Hide file tree
Showing 328 changed files with 9,089 additions and 0 deletions.
29 changes: 29 additions & 0 deletions Abstract_Class/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
8 changes: 8 additions & 0 deletions Abstract_Class/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions Abstract_Class/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Abstract_Class/.idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions Abstract_Class/.idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Abstract_Class/abstractClassExample.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
25 changes: 25 additions & 0 deletions Abstract_Class/src/Doping.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// abstract sınıf örneği
public abstract class Doping {

protected double price;
protected double[] taxes;

public double[] getTaxes() {
return taxes;
}

public void setTaxes(double[] taxes) {
this.taxes = taxes;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

// soyut metot örneği
public abstract double calculate();
}
9 changes: 9 additions & 0 deletions Abstract_Class/src/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* @author Nida Başer
* March 2024
*/
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
67 changes: 67 additions & 0 deletions Abstract_Class/src/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Soyutlama (Abstraction)

- Nesne yönelimli programlamada Soyutlama (Abstraction) ilkesi, eğer bir sınıf için nesne üretmek mantıksız geliyorsa o sınıf soyutlanabilir.
- Alt sınıfların ortak özelliklerini ve işlevlerini taşıyan ancak henüz bir nesnesi olmayan bir
üst sınıf oluşturmak istenirse bir soyut (abstract) üst sınıf oluşturulur.

- Soyutlama, bir sınıfa veya metoda temel görevlerin tanımlanması, detayların ise tanımlanmaması demektir.
Temel olarak bir soruna ait çözüme giderken kullanılacak yöntemlerin, ilk etapta daha genel basit ve soyut bir tanımını yapmaktır.

### "abstract" Anahtar Kelimesi ve Soyut Sınıf Kavramı (Abstract Class)

Soyutlama kavramı sınıfın içindeki iç işleyişi dışarıdan izole etmek, yani gizlemektir.
Örneğin: bilgisayarı kullanırken çoğu kullanıcı bilgisayarın iç işleyişinden haberi olmaz.
Hafızanın işlemciyle haberleşmesi, işlemler arası senkronizasyon, klavyeden girilen değerlerin ekrana yansıması gibi
birçok işlemin detayı kullanıcılardan gizlenmiş durumdadır. Kullanıcılar sadece bu fonksiyonları veya işlevleri bir arayüz
vasıtasıyla çağırıp kullanmaktadır. İç detaylarına müdahale etmemektedir.

- Aynı şekilde Java'da sınıflarımızı tasarlarken bazı fonksiyonların ve işlevlerin sadece sınıf içinde kalması,
dış dünyada bu sınıftan nesneleri kullanan kişilerin bu iç fonksiyonları bilemelerine gerek yoktur.

- Örneğin: KDV tutarını hesaplayan fonksiyonun sınıf içinde kullandığı birçok başka fonksiyon olabilir.
- Bu fonksiyonların sınıf dışına açılmasının bir anlamı yoktur.
- Sadece miktarı verip o miktara göre KDV tutarını hesaplayacak bir dış fonksiyon yeterlidir.

- Yazılım dünyasında bu nedenle soyutlama kavramı yazılım tasarımında önemli bir kavramdır.
- Soyutlama yapabilmek için "abstract" anahtar kelimesi, "interface" gibi yapılar bizlere yardımcı olmaktadır.

### Soyutlama için Java'da iki yöntem mevcuttur:

- "interface" tanımlamak
- "abstract" sınıf tanımlamak

## Soyut Sınıf (Abstract Class)
"abstract" anahtar kelimesi ile tanımlanan sınıflardır. Sınıfın içinde soyut ("abstract") metotlar veya
normal fonksiyonlar tanımlanabilir. Soyut sınıflardan "new" anahtar kelimesi ile bir nesne oluşturulamaz.

### Soyut Sınıf Özellikleri:

- "abstract" anahtar kelimesi ile tanımlanmış olması gerekiyor.
- Soyut veya soyut olmayan fonksiyonlar tanımlanabilir.
- Soyut sınıflardan "new" anahtar kelimesi ile nesne oluşturulamaz.
- Kurucu metodu ve static fonksiyonlar tanımlanabilir.
- "final" kelimesi ile tanımlanmış fonksiyonları içerebilir. Bu final fonksiyonlar alt sınıflarda ezilemezler (override).

## Bu projede ne yaptık?

- Bu projedeki örnekte "abstract" kelimesi ile soyut bir sınıf tanımladık.
- Ayrıca sınıfın içinde "calculate" isimli "abstract" metot tanımladık.
- Aynı zamanda soyut olmayan metotlar da tanımladık.

Senaryomuzda bir e-ticaret sisteminde "Doping" tipinde ek ürünler olduğunu düşünelim.
İlan tarihini güncelleyen bir doping çeşidimiz olsun, bir de üst sırada çıkmanızı sağlayan bir doping olsun.
Bu iki alt sınıfta "Doping" isimli sınıftan kalıtım alarak belli özellikleri kendilerine alsınlar.
Fakat, her dopingin ücret hesaplama yöntemi birbirinden farklı olabilir.
Ayrıca, her dopingin mutlaka fiyat hesaplama fonksiyonu olmalıdır.

Yukarıdaki durumda "abstract" sınıf tanımlayıp diğer doping çeşitleri bu ATA sınıftan kalıtım alacaklardır.
"calculate" isimli "abstract" metodu, "metod ezme" (overriding) yöntemiyle ezip metodun içini kendilerine göre dolduracaklardır.
Alt sınıflardaki diğer özellikler soyutlama tekniğiyle dış dünyadan gizlenecektir.
Dış dünyadan dopingi kullanmak isteyen başka bir sınıf veya kod parçası doping nesnesi üzerindeki "calculate" fonksiyonunu çağırıp fiyatı hesaplacaktır.
Diğer iç hesaplama ve çalışma detaylarını bilmeyecektir.

"Doping" soyut sınıfından kalıtımla gelen, "calculate" isimli soyut metodu metot ezmesi yöntemiyle alt sınıf kendi ihtiyacına göre dolduruyor.
"UptodateDoping" isimli doping tipinde vergiler fiyata dahil olduğu için komisyon oranı eklenip ve vergiler hesaplanıp ücret belirleniyor.
Görüldüğü gibi her doping çeşidinin fiyat hesaplama yöntemleri birbirinden farklıdır.
Soyutlama ile sınıflara ait iç çalışma detayları gizlenmiş oluyor.
Doping tiplerinde sadece "calculate" isimli fonksiyonu dış dünyaya açtık. Diğer tüm fonksiyonlar ve özellikler sınıf içinde kaldı.
15 changes: 15 additions & 0 deletions Abstract_Class/src/TopOfListDoping.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
public class TopOfListDoping extends Doping {

public TopOfListDoping(double price) {
super.setPrice(price);
}

// "Doping" soyut sınıfından kalıtımla gelen, "calculate" isimli soyut metodu metot ezmesi yöntemiyle alt sınıf kendi ihtiyacına göre dolduruyor.
// "TopOfList" isimli doping tipinde vergiler olmadığı için komisyon oranı eklenip ücret hesaplanıyor. Fakat, başka doping çeşitlerinde hesaplama farklı olabilir.
@Override
public double calculate() {

return super.getPrice() + super.getPrice() * 0.35;
}
}

30 changes: 30 additions & 0 deletions Abstract_Class/src/UptodateDoping.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
public class UptodateDoping extends Doping {

public UptodateDoping(double price, double[] taxes) {
super.setPrice(price);
super.setTaxes(taxes);
}

// "Doping" soyut sınıfından kalıtımla gelen, "calculate" isimli soyut metodu metot ezmesi yöntemiyle alt sınıf kendi ihtiyacına göre dolduruyor.
// "UptodateDoping" isimli doping tipinde vergiler fiyata dahil olduğu için komisyon oranı eklenip ve vergiler hesaplanıp ücret belirleniyor.
// Görüldüğü gibi her doping çeşidinin fiyat hesaplama yöntemleri birbirinden farklıdır. Soyutlama ile sınıflara ait iç çalışma detayları gizlenmmiş oluyor.
// Doping tiplerinde sadece "calculate" isimli fonksiyonu dış dünyaya açtık. Diğer tüm fonksiyonlar ve özellikler sınıf içinde kaldı.
@Override
public double calculate() {

return calculateTaxes() + commisionRate();
}

private double calculateTaxes() {

double totalTaxValue = 0;
for (int i = 0; i < super.getTaxes().length; i++) {
totalTaxValue += super.getTaxes()[i];
}
return totalTaxValue;
}

private double commisionRate() {
return super.getPrice() * 0.2;
}
}
29 changes: 29 additions & 0 deletions Autoboxing_Unboxing/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
8 changes: 8 additions & 0 deletions Autoboxing_Unboxing/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions Autoboxing_Unboxing/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Autoboxing_Unboxing/.idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Autoboxing_Unboxing/Autoboxing_Unboxing.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
32 changes: 32 additions & 0 deletions Autoboxing_Unboxing/src/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* @author Nida Başer
* March 2024
*/
public class Main {
public static void main(String[] args) {

int a = 10;

// Autoboxing
Integer b = a;

// Boxing
Integer c = Integer.valueOf(a);
// Bunun otomatik yapıldığını ve gereksiz olduğunu söylüyor

// Auto Unboxing
int d = c; // Bu zaten c.intValue(); işlemi yapmış oluyor otomatik
System.out.println(d);
/*
Burada d nesne gibi davranamıyor ama eşitlendiği c bir nesne
c.toString(); // diyebiliyoruz
d.toString(); // diyemiyoruz
*/

// Unboxing
int i = c.intValue();
// Bu da otomatik yapıldığı için gereksiz uyarısı verir.


}
}
39 changes: 39 additions & 0 deletions Autoboxing_Unboxing/src/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# (Autoboxing) ve Kutudan Çıkarma (Unboxing)
İlkel veri türleri (primitive data types) ve sarmalayıcı sınıfları (wrapper classes) arasında
nasıl dönüşüm yapılabileceğini gördük. Bunu daha kısa bir şekilde yapabilmek için JDK 5 ile
kutulama ve kutudan çıkarma özelliği getirilmiştir. Bu sayede ilkel veri türlerini
sarmalayıcı sınıflarına hiçbir ek işlem yapmadan atayabilirsiniz.

```java
byte primitiveByte = 1;
Byte byteObject = primitiveByte;
byte byteValue = byteObject;

short primitiveShort = 1;
Short shortObject = primitiveShort;
short shortValue = shortObject;

int primitiveInt = 1;
Integer intObject = primitiveInt;
int intValue = intObject;

long primitiveLong = 1L;
Long longObject = primitiveLong;
long longValue = longObject;

float primitiveFloat = 1.0f;
Float floatObject = primitiveFloat;
float floatValue = floatObject;

double primitiveDouble = 1.0d;
Double doubleObject = primitiveDouble;
double doubleValue = doubleObject;

char primitiveChar = 'a';
Character charObject = primitiveChar;
char charValue = charObject;

boolean primitiveBoolean = true;
Boolean booleanObject = primitiveBoolean;
boolean booleanValue = booleanObject;
```
Loading

0 comments on commit 838ef0d

Please sign in to comment.