#100DaysOfCode
Day#36
Merhabalar bugün bootcamp notlarım ile devam edeceğiz.
State ?
“State” (durum), bir uygulamadaki belirli bir anın durumunu veya durumunu temsil eden bilgilerdir. State, genellikle kullanıcı etkileşimleri veya uygulama içindeki değişikliklerle ilgilidir. Flutter gibi kullanıcı arayüzü geliştirme framework’leri, özellikle UI (kullanıcı arayüzü) değişiklikleri ile ilgili durumu yönetmek için bir konsept olan “widget state” kullanır.
Flutter’da iki temel türde state bulunur:
- Eternal (Kalıcı) State (StatelessWidget):
- Widget’in yapılandırıldığı andan itibaren değişmeyen (değişmez) durumu temsil eder.
- Kullanıcı etkileşimleri, zamanla değişen veriler veya diğer faktörlerden bağımsızdır.
StatelessWidgetsınıfı, state'i olmayan (kalıcı) bir widget'i temsil eder.
class MyApp extends StatelessWidget {
final String message;
const MyApp({Key? key, required this.message}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Text(message),
),
),
);
}
}- Mutable (Değişken) State (StatefulWidget):
- Widget’in durumu zaman içinde değişebilir.
- Kullanıcı etkileşimleri, zamanla değişen veriler veya diğer faktörler, widget’in yeniden oluşturulmasına neden olarak state’in güncellenmesine yol açabilir.
StatefulWidgetsınıfı, state'i olan (değişken) bir widget'i temsil eder.
class MyStatefulApp extends StatefulWidget {
@override
_MyStatefulAppState createState() => _MyStatefulAppState();
}
class _MyStatefulAppState extends State<MyStatefulApp> {
String message = "Başlangıç Mesajı";
void updateMessage() {
setState(() {
message = "Yeni Mesaj!";
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(message),
ElevatedButton(
onPressed: updateMessage,
child: Text("Mesajı Güncelle"),
),
],
),
),
),
);
}
}Bu örneklerde, StatefulWidget kullanarak bir widget'in durumunu değiştirme ve bu duruma bağlı olarak kullanıcı arayüzünü güncelleme yeteneği gösterilmektedir. StatefulWidget sınıfları, ilişkili State sınıfları aracılığıyla durumlarını yönetirler. setState metodu, durumu güncellediğinizi ve UI'nin güncellenmesi gerektiğini bildirir.
- Margin = nesneler arası
- padding = nesnenin içi
- ? optional keyword’ü değişkenin null olup olamayacağı konusunda bize yardımcı olur.
Stack ?
“Stack”, veri yapısı açısından bir koleksiyonun üzerine eklenen ve en son eklenen öğenin en önce çıkarıldığı bir veri yapısıdır. Bu yapının çalışma mantığı, son gelen veri öğesinin ilk çıkartılması prensibine dayanır, bu nedenle “Last In, First Out” (LIFO) olarak adlandırılır.
Stack’te temel iki ana işlem vardır:
- Push (Ekleme): Yeni bir öğeyi stack’e ekler.
- Pop (Çıkartma): En üstteki öğeyi stack’ten çıkarır.
Bu iki işlem, stack’in üzerindeki veri öğelerinin nasıl eklenip çıkarılacağını belirler. Ayrıca, stack’te en üstteki öğeyi gösteren bir “top” (tepe) vardır.
Stack, özellikle bir fonksiyon çağrıları, işlemci yönetimi, geri alma (undo) işlemleri ve diğer birçok senaryoda kullanılır. Programlama dilleri, işletim sistemleri ve çeşitli uygulama alanlarında stack veri yapısı yaygın olarak kullanılır.
Heap ?
Heap, bilgisayar bilimlerinde, program çalışma zamanında dinamik olarak tahsis edilen bellek bölgesini ifade eder. Bu bellek bölgesi, programın çalışma süreci içinde dinamik olarak büyüyebilir veya küçülebilir. Heap, özellikle dinamik bellek tahsisinin yapıldığı ve serbest bırakıldığı yerdir.
Get Ömer Faruk Didin’s stories in your inbox
Join Medium for free to get updates from this writer.
İşte heap ile ilgili bazı temel kavramlar:
- Bellek Tahsis ve Serbest Bırakma:
- Heap üzerinde bellek tahsis edilirken
new(C++ ve Java'da) veyamalloc(C'de) gibi operatörler kullanılır. - Bellek serbest bırakma işlemi, artık kullanılmayan belleği sisteme geri vermek için
delete(C++ ve Java'da) veyafree(C'de) gibi operatörler kullanılarak yapılır.
- Dinamik Bellek Yönetimi:
- Heap, programın çalışma zamanında bellek yönetimini sağlar. Bu, programcının ihtiyaçlarına bağlı olarak bellek alanının dinamik olarak genişletilebilmesi ve serbest bırakılabilmesini sağlar.
- Ancak, yanlış bellek yönetimi (bellek sızıntıları, bellek taşmaları) program hatalarına ve performans sorunlarına yol açabilir.
- Farklı Dillerde Heap Kullanımı:
- C ve C++ gibi dillerde, bellek tahsis ve serbest bırakma işlemleri programcı tarafından daha manuel olarak yapılır.
- Java, C#, Python gibi dillerde ise garbage collection (çöp toplama) mekanizması sayesinde otomatik olarak kullanılmayan bellek alanları temizlenir.
- Heap ve Stack Farkı:
- Heap ve stack, bellek yönetimi açısından farklıdır. Stack, özellikle yerel değişkenlerin saklandığı bir bellek bölgesidir ve stack bellek yönetimi otomatiktir. Heap ise dinamik bellek yönetimine tabidir ve programcı tarafından kontrol edilir.
Heap, genellikle büyük ve dinamik veri yapıları (örneğin, bağlı listeler, ağaçlar, dinamik diziler) veya büyük veri setleri için kullanılır.
Async ve Sync nedir ?
Async (Asenkron) ve Sync (Senkron) terimleri, programlamada işlemlerin yürütülme şeklini ifade eder. İşlemler, birbirine bağlı olabilir veya bağımsız olarak çalışabilir. İşte bu iki kavramın açıklamaları:
- Sync (Senkron) Program:
- Senkron program, işlemlerin sıralı ve adım adım yürütüldüğü bir program türüdür.
- Bir işlemin tamamlanması beklenir ve ardından bir sonraki işlem başlatılır. Yani, her işlem önceki işlemin tamamlanmasını bekler.
- Senkron programlar, işlemler arasında bağımlılıkların olduğu durumlarda kullanışlı olabilir. Ancak, uzun süren işlemler veya giriş/çıkış (I/O) işlemleri gibi durumlarda performans sorunlarına neden olabilir.
def senkron_program():
print("Adım 1")
print("Adım 2")
print("Adım 3")
senkron_program()2. Async (Asenkron) Program:
- Asenkron program, işlemlerin birbirinden bağımsız olarak çalışabildiği bir program türüdür.
- Bir işlem başlatıldığında, program diğer işlemleri beklemeksizin devam eder. Bu sayede, uzun süren işlemlerin veya paralel işlemlerin daha etkili bir şekilde yönetilmesine olanak tanır.
- Asenkron programlar genellikle I/O işlemleri (dosya okuma/yazma, ağ çağrıları) veya uzun süren hesaplamalar için kullanılır.
import asyncio
async def asenkron_program():
print("Adım 1")
await asyncio.sleep(1) # Sanal bir uzun süren işlemi simgeliyor
print("Adım 2")
await asyncio.sleep(1)
print("Adım 3")
asyncio.run(asenkron_program()) Async ve sync programlama, özellikle modern programlama dillerinde ve framework’lerde yaygın olarak kullanılır. Asenkron programlama, özellikle kullanıcı arayüzü etkileşimleri, ağ çağrıları ve diğer uzun süren işlemlerle başa çıkmak için oldukça önemlidir, çünkü bu tür işlemlerin senkron bir şekilde gerçekleştirilmesi uygulamanın performansını düşürebilir.
Try-Catch
try-catch bloğu, programın belirli bir bölümündeki potansiyel hata durumlarına karşı kodunuzu korumanıza olanak tanıyan bir yapıdır. Bu yapı, hata yakalamak ve uygun bir şekilde ele almak için kullanılır.
İşte bir örnek:
void main() {
try {
// Hata oluşturabilecek kod
int sonuc = 12 ~/ 0; // Bu satırda bölme hatası (integer bölme sıfıra bölünemez)
print("Sonuç: $sonuc"); // Bu satır çalışmayacak
} catch (e) {
// Hata yakalandığında çalışacak kod
print("Hata Oluştu: $e");
} finally {
// Her durumda çalışacak kod
print("finally bloğu çalıştı");
}
// Program buraya kadar geldiği için devam eder
print("Program devam ediyor");
}Bu örnekte, try bloğu içindeki kod bir hata oluşturur (sıfıra bölme hatası). Bu hatayı yakalamak için catch bloğu kullanılır. finally bloğu ise her durumda çalışacak kodu içerir ve hata oluşsa da olmasa da çalışır.
Dart ve diğer birçok modern programlama dilinde, try-catch blokları ile belirli hata türlerini hedef alabilir ve bu hatalara özel işlemler uygulayabilirsiniz. Örneğin:
void main() {
try {
int sonuc = 12 ~/ 0; // Bu satırda bölme hatası
print("Sonuç: $sonuc"); // Bu satır çalışmayacak
} on IntegerDivisionByZeroException {
// Sıfıra bölme hatası özel olarak ele alınıyor
print("Sıfıra bölme hatası yakalandı");
} catch (e) {
// Diğer hatalar burada ele alınabilir
print("Hata Oluştu: $e");
} finally {
print("finally bloğu çalıştı");
}
print("Program devam ediyor");
}Bu örnekte, on anahtar kelimesi ile belirli bir hata türü belirtilmiştir.
Bugünlük bu kadar, sonraki bootcamp gününde devam edeceğim (16.11.2023)










