Daha fazla kod yazmaya devam edersem, kodu düzenlememin benim için zor olacağı bir zaman olacaktır.
Bu sizin probleminiz: organizasyonu doğru yapın ve stil daha kolay akmalıdır.
Etmeyin bekleyin kodunuzu düzenlemek için: sen giderken kodunuzu düzenli tutmak. Dil sizin için yapmasa da, kod yine de düşük kuplaj ve yüksek uyum içeren modüller halinde organize edilmelidir.
Bu modüller doğal olarak bir ad alanı sağlar. Çarpışmaları önlemek için modül adını (uzunsa) kısaltın ve işlev adlarını modülleriyle birlikte önekleyin.
Bireysel tanımlayıcılar düzeyinde, bunlar kabaca artan öznellik düzenindedir:
- bir kongre seç ve ona uy
- örneğin,
function_like_this(struct TypeLikeThis variable)
yaygın
kesinlikle Macar gösteriminden kaçının (üzgünüm JNL)
başlangıçta amaçlandığı gibi kullanmayacaksanız , korkunç sistem sürümü yerine Simonyi'nin uygulama gösterimi anlamına gelir
Neden? Bununla ilgili bir deneme yazabilirim, ancak bunun yerine Joel Spolsky'nin bu makalesini okumanızı ve daha sonra ilgileniyorsanız biraz daha avlanmanızı öneririm . Altta Simonyi'nin orijinal gazetesine bir bağlantı var.
gerçekten opak çerez türleri olmadıkça işaretçi tip tanımlarından kaçının - yalnızca şeyleri karıştırırlar
struct Type *ok;
typedef struct Type *TypePtr;
TypePtr yuck;
Opak çerez türü ile ne demek istiyorum ? İstemci koduna iletilmesi gereken bir modül (veya kitaplık ya da her neyse) içinde kullanılan bir şey kastediyorum, ancak bu istemci kodu doğrudan kullanamaz . Sadece kütüphaneye geri veriyor.
Örneğin, bir veritabanı kitaplığı aşağıdaki gibi bir arabirim gösterebilir
/* Lots of buffering, IPC and metadata magic held in here.
No, you don't get to look inside. */
struct DBContextT;
/* In fact, you only ever get a pointer, so let's give it a nice name */
typedef struct DBContexT *DBContext;
DBContext db_allocate_context(/*maybe some optional flags?*/);
void db_release_context(DBContext);
int db_connect(DBContext, const char *connect);
int db_disconnect(DBContext);
int db_execute(DBContext, const char *sql);
Şimdi, içerik istemci koduna opaktır , çünkü içeriye bakamazsınız. Sadece kütüphaneye geri ver. Gibi bir FILE
şey de opak ve bir tamsayı dosya tanımlayıcı da bir çerez , ancak opak değil.
Tasarım üzerine bir not
Hiçbir açıklama yapmadan yukarıda düşük bağlantı ve yüksek uyum ifadesini kullandım ve bu konuda biraz kötü hissediyorum. Bunu arayabilir ve muhtemelen bazı iyi sonuçlar bulabilirsiniz, ancak kısaca ele almaya çalışacağım (tekrar, bir deneme yazabilirim ama etmemeye çalışacağım).
Yukarıda çizilen DB kütüphanesi , dış dünyaya küçük bir arayüz açığa çıkardığı için düşük kuplaj gösterir . Uygulama ayrıntılarını (kısmen opak çerez hile ile) gizleyerek, istemci kodunun bu ayrıntılara bağlı olmasını önler.
Opak çerez yerine, içerik yapısını içeriği görünür olacak şekilde ve veritabanına bir TCP bağlantısı için bir soket dosyası tanımlayıcısı içeren beyan ederiz. Daha sonra DB aynı makinede çalışırken paylaşılan bir bellek segmentinin kullanımını desteklemek için uygulamayı değiştirirsek, istemcinin yeniden bağlanmak yerine yeniden derlenmesi gerekir. Daha da kötüsü, istemci dosya tanımlayıcısını kullanmaya başlamış olabilir , örneğin setsockopt
varsayılan arabellek boyutunu değiştirmek için arama yapıyor ve şimdi de bir kod değişikliğine ihtiyacı var. Tüm bu detaylar, mümkün olan yerlerde modülümüzün içinde gizlenmelidir ve bu, modüller arasında düşük bağlantı sağlar .
Örnek ayrıca modüldeki tüm yöntemlerin aynı görevle (DB erişimi) ilgili olması nedeniyle yüksek uyumu gösterir . Bu, yalnızca uygulama ayrıntıları hakkında bilgi sahibi olması gereken kodun (yani, çerezimizin içeriği) bunlara gerçekten erişebileceği anlamına gelir, bu da hata ayıklamayı basitleştirir.
Ayrıca, tek bir endişeye sahip olmanın, bu işlevleri birlikte gruplandırmak için bir önek seçmeyi kolaylaştırdığını görebilirsiniz.
Şimdi, bu örneğin iyi olduğunu söylemek kolaydır (özellikle tam olmadığı için), ancak hemen size yardımcı olmaz. İşin püf noktası, kodunuzu yazarken ve genişletirken, benzer şeyler yapan veya aynı türlerde (kendi modülleri için aday olabilecek) işlevler için ve ayrıca birçok ayrı şey yapan işlevler için t gerçekten ilgili ve bölünmek için aday olabilir.