Bağımlı herhangi bir sistemde temel olarak iki seçenek vardır. Soyutlama ve entegrasyon. (Ben bilerek teknik terimler kullanmıyorum). Soyutlama ile, bir API’yi aradığınızda, API’nin arkasındaki kod değişse de sonucun daima aynı olacağını söylersiniz. Örneğin, aradığımızda fs.open()
ağ sürücüsü, SSD veya sabit disk olup olmadığına aldırmıyoruz, her zaman birlikte yapabileceğimiz açık bir dosya tanıtıcısı alırız. "Bütünleşme" ile amaç, değişse bile bir şeyi yapmanın "en iyi" yolunu sağlamaktır. Örneğin, bir dosyayı açmak, bir ağ paylaşımı için diskteki bir dosyadan farklı olabilir. Her iki yol da modern Linux masaüstünde oldukça yaygın olarak kullanılmaktadır.
Geliştiriciler açısından "herhangi bir sürümle çalışır" veya "belirli bir sürümle çalışır" meselesidir. Buna güzel bir örnek OpenGL'dir. Çoğu oyun belirli bir OpenGL sürümü ile çalışmak üzere ayarlanmıştır. Kaynaktan derleyip derlemeniz önemli değil. Oyun OpenGL 1.1 kullanacak şekilde yazılmışsa ve oyunu 3.x'de çalıştırmaya çalışıyorsanız, iyi vakit geçirmeyeceksiniz. Spektrumun diğer ucunda, bazı aramaların ne olursa olsun çalışması bekleniyor. Örneğin, fs.open()
hangi çekirdeğin üzerinde olduğum umrumda değil. Sadece bir dosya tanımlayıcısı istiyorum.
Her yönden fayda var. Entegrasyon geriye dönük uyumluluk pahasına "daha yeni" özellikler sunar. Soyutlama, "daha yeni" aramalara göre stabilite sağlarken. Her ne kadar önemli olduğunu belirtmek önemli olsa da, bir olasılık meselesi değil.
Toplumsal bir bakış açısından, gerçekten çok iyi bir neden olmadan, soyutlama karmaşık bir sistemde her zaman daha iyidir. Örneğin, fs.open()
çekirdek sürümüne bağlı olarak farklı çalışıp çalışmadığını düşünün . O zaman basit bir dosya sistemi etkileşim kütüphanesinin birkaç yüz farklı "açık dosya" yöntemini (veya muhtemelen engellemeyi) sürdürmesi gerekir. Yeni bir çekirdek sürümü çıktığında "yükseltme" yapamazsınız, kullandığınız her bir yazılımı test etmek zorunda kalırsınız. Çekirdek 6.2.2 (sahte) sadece metin editörünüzü kırabilir.
Bazı gerçek dünya örnekleri için OSX, Kullanıcı Alanını kırma umrunda değil. Daha çok "soyutlama" yerine "entegrasyon" u hedefliyorlar. Her büyük işletim sistemi güncellemesinde de işler bozuluyor. Bu, bir yolun diğerinden daha iyi olduğunu söylemez. Bu bir seçim ve tasarım kararı.
En önemlisi, Linux eko sistemi, insanların ya da grupların boş zamanlarında projede çalıştıkları ya da aracın faydalı olması nedeniyle harika açık kaynak projeleriyle doludur. Bunu akılda tutarak, ikinci eğlenmeyi bırakıp PIA olmaya başlar, bu geliştiriciler başka bir yere gider.
Mesela ben bir yama gönderdim BuildNotify.py
. Fedakar olduğum için değil, aracı kullandığım için ve bir özellik istediğim için değil. Kolaydı, işte burada bir yamanın olması. Karmaşık veya hantal olsaydı, kullanmazdım BuildNotify.py
ve başka bir şey bulurdum. Ne zaman bir çekirdek güncellemesi ortaya çıkarsa, metin düzenleyicim bozulursa, farklı bir işletim sistemi kullanırdım. Topluma katkılarım (ancak küçük) devam etmeyecek veya olmayacaktı.
Böylece, tasarım kararı soyut sistem çağrıları için verildi, böylece yaptığım fs.open()
zaman işe yarıyor. Bu popülerlik kazandıktan fs.open
sonra uzun süre korumak demektir fs.open2()
.
Tarihsel olarak, bu genel POSIX sistemlerinin amacıdır. “Burada bir dizi çağrı ve beklenen geri dönüş değerleri var, ortadakileri anlıyorsunuz.” Tekrar taşınabilirlik nedeniyle. Linus neden bu metodolojiyi kullanmayı seçti, beyninin içindesin ve nedenini tam olarak bilmesini istemelisin. Ancak ben olsaydım, karmaşık bir sistemde entegrasyon yerine soyutlamayı seçerdim.