C ++ Kütüphane API Tasarımı


12

C ++ kütüphaneleri için iyi API tasarımı hakkında bilgi edinmek, paylaşılan nesneleri / dll'leri vb. İncelemek için iyi bir kaynak arıyorum. Güzel API'ler, güzel sınıflar, şablonlar ve benzeri kaynak seviyesinde yazma konusunda birçok kaynak var, ancak neredeyse hiçbir şey yok şeyleri paylaşılan kütüphanelerde ve yürütülebilir dosyalarda bir araya getirmek. John Lakos'un Büyük Ölçekli C ++ Yazılım Tasarımı gibi kitaplar ilginç ama çok eski.

Aradığım şey, şablonları ele alma konusunda tavsiyedir. API'mdaki şablonlarla sık sık çalıştırılabilir dosyamda (veya başka bir kütüphanede) kütüphane koduyla karşılaşıyorum, bu yüzden orada bir hatayı düzeltirsem yeni kütüphaneyi açamam, ancak bu kodun tüm istemcilerini yeniden derlemeli ve yeniden dağıtmalıyım. (ve evet, en azından kütüphane içindeki en yaygın sürümleri somutlaştırmaya çalışmak gibi bazı çözümler biliyorum.)

Ayrıca C ++ kitaplıkları üzerinde çalışırken ikili uyumluluk tutmak için akılda diğer uyarılar ve şeyler arıyorum.

Bu tür şeyler hakkında iyi bir web sitesi veya kitap var mı?


Bunu şu şekilde ele aldım: sivut.koti.soon.fi/~terop/GameApi.html - yani lib içinde şablonlar varken, hiçbiri api'de değil ...
tp1

1
std::unique_ptroldukça yeni şeyler. Önerilen API'nız için tam olarak neyin daha uygun olduğunu düşündünüz ? Örneğin, tüm kaynakları manuel olarak nasıl yönetmeniz gerektiği, örneğin sızıntıları ve çift silme işlemlerini neredeyse garanti ettiniz mi? Ya da türlerinizin çoğunun bir ya da iki harf adı olan ve amaçlarını bölmeyi imkansız kılan yöntem?
DeadMG

1
@ tp1: Ama onları hallettiğime dikkat etmedin. Sen hiç bir şey yapmadan "ONLARI KOLLA" dedin. Onlara dokunmadım ve şimdi ne olacak? Bu tür hatalara izin vermeyen bir RAII sınıfı kullanmak yerine. Kullanmış olsaydınız böyle bir unique_ptrkod yazmak mümkün olmazdı.
DeadMG

1
@ tp1: Env'in yok edilebileceğini fark ettim. Hepsi bukadar. Nesneleri yönetmek için herhangi bir işlev görünmüyor. Eğer hafızayı "Şimdiye kadar oluşturduğum her şey" veya "Hiçbir şey" den daha ince taneli yönetmek istersem, berbat olduğum anlaşılıyor.
DeadMG

3
Lütfen herhangi bir uzun sohbeti Software Engineering Chat ile yapın . Soruya veya cevaba yararlı bilgiler dahil edilebilir mi?
ChrisF

Yanıtlar:



3

Bu neredeyse imkansız. Basit gerçek şu ki, bazen bir iş yapmak için derleyiciye ihtiyacınız vardır ve bu zorunluluğu sadece büyü yapamazsınız. std::vectorYalnızca başlık içeren bir kitaplık yapamayan bir işlev yoktur . Derleyici birçok büyüyü çalıştırabilir, ancak onları çağırmadan sahip olamazsınız ve bu hayatın bir gerçeği.

Yapabilecekleriniz: İhtiyacınız olmayan şablonları kullanmayın. Yapamayacağınız şey: başka bir şey.

Basit gerçek şu ki, yeni sürümle yeniden derleme, statik olarak yazılmış kütüphanelerle elde edebileceğiniz performans, güvenlik ve işlevsellik avantajlarına kıyasla gerçekten büyük bir yük değil.


2
Bunu düşünmek için örnek olarak bahsettim. aradığım şey, hazırlamam gereken diğer benzer konularda rehberlik ve bunları ele almak için en iyi uygulamalar.
johannes

ABI uyumluluğunu bozan tüm yeni sürümler yeni bir satır içi ad alanına yerleştirilirse, yalnızca başlık içeren bir kitaplık olup olmaması ne anlama gelir?
Tekilleştirici
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.