2 puan yazan beenzinozino 2025-01-25 | 2 yorum | WhatsApp'ta paylaş

Merhaba!

Node.js ortamında Clang kullanan bir C, C++, Java ve JavaScript formatlayıcısı geliştirdim. Bu proje, artık bakımı yapılmayan Angular clang-format paketini temel alarak yeniden başlatılan bir projedir.

Buna benzer bir içeriği iki-üç ay önce paylaşmıştım; bu kez v1.3.0 sürümünü yayımlarken kullanıcıların daha kolay ve rahat kullanabilmesi için ayrıntılı bir dokümantasyon sitesi de ekledim. Dokümantasyon sitesine buradan ulaşabilirsiniz; temel kurulum yöntemlerinden bu paketi neden kullanmanız gerektiğine kadar çeşitli içerikler yer alıyor, ilgilenenlerin göz atmasının faydalı olacağını düşünüyorum.

Bu güncellemede çeşitli testler ekleyerek paketin kararlılığını daha da artırdım, ayrıca yeni özellikler de eklendi.

Bu paketlerin tamamı MIT lisanslıdır ve özgürce kullanabilirsiniz.


clang-format-node nasıl bir proje?

Bu paket, LLVM’nin C derleyicisi olarak tanınan Clang’ın clang-format aracısını temel alan ve C, C++, Java dillerinde kod formatlamayı destekleyen bir Node.js paketidir. Kısacası, Node.js ortamında Prettier’a benzer bir rol üstlenir; ancak farkı, Prettier’ın desteklemediği C, C++ ve Java dilleri için formatlama sağlamasıdır.

Özellikle Node.js core ya da Electron geliştirme gibi JavaScript kodu ile C/C++ kodunu birlikte yazmanız gereken durumlarda clang-format-node kullanışlıdır.

Mevcut clang-format paketinde Ubuntu gibi işletim sistemi ortamlarına bağlı ek bağımlılıkları kurma zahmeti vardı; ancak bu paketi kullanırsanız ek bir kurulum olmadan doğrudan kullanabilirsiniz. Ayrıca mevcut paketin CI ortamlarında Node.js ve npm tabanlı iş akışlarına entegre edilmesi zahmetliyken, clang-format-node npm’den kurup yalnızca script ayarlayarak kolayca kullanılabildiği için CI ortamında birçok avantaj sunar.


Peki clang-format-node paketinin özellikleri neler?

1. Angular clang-format için Drop-in Replacement

clang-format-node, Angular/clang-format paketinin kolayca yerine geçebilen bir Drop-in Replacement’tır.
Mevcut paketten clang-format-node’a geçiş oldukça basittir ve karmaşık bir sürece gerek kalmadan hemen kullanılabilir.

2. Clang kullanmak için ek bağımlılıklara gerek yok; yalnızca Node.js yeterli

Python veya C++ gibi ek bağımlılıklara hiç ihtiyaç yoktur. Yalnızca Node.js ile kolayca çalıştırabilirsiniz.

3. Geniş destek kapsamı

Çeşitli işletim sistemleri ve mimariler, Node.js sürümleri, GitHub Actions runner imajları ve Docker build imajları geniş kapsamda desteklenir.

4. Kolay CI yapılandırması

Karmaşık ayarlara gerek olmadan, diğer Node.js paketlerinde olduğu gibi clang-format-node kullanılabilir.

5. Otomatik build ve release

clang-format güncellendiğinde yeni npm sürümü otomatik olarak yayımlanır. GitHub Actions düzenli olarak güncellemeleri algılar, paketi build eder ve ardından bir Pull Request oluşturur.


clang-format ve git-clang-format ile kod formatlama

(Aşağıdaki yazı, benim https://clang-format-node.lumir.page/docs/get-started/introduction bölümünde İngilizce olarak yazdığım metnin kısmen Koreceye çevrilmiş hâlidir.)

Kod formatlamanın önemi

Kodu her zaman formatlayın

Kod formatlama, kod kalitesini yükseltmede çok önemli bir iştir. Formatlamanın özü, kodun biçimini tutarlı tutarak okunabilirliği ve anlaşılabilirliği artırmaktır.


clang-format nedir?

clang-format, C ve C++ gibi dillerdeki kaynak dosyaları otomatik olarak formatlayan bir araçtır ve LLVM Clang açık kaynak projesinin bir parçası olarak geliştirilmiştir.

Nasıl çalışır?
  1. Yapılandırma dosyası oluşturma
    Formatlama stilini tanımlayan bir yapılandırma dosyası (.clang-format) oluşturulur.
  2. Komutu çalıştırma
    clang-format komutu çalıştırıldığında kaynak kod belirtilen stil kurallarına göre otomatik olarak yeniden düzenlenir.
Başlıca özellikler
  • Çeşitli dil desteği
    C, C++, Java, JavaScript, Objective-C, Protobuf, C# gibi birçok dili destekler.
  • Formatlama komutu örneği
    clang-format -i my_source.cpp  
    
    Bu komut çalıştırıldığında my_source.cpp dosyası belirlediğiniz stile göre otomatik olarak formatlanır.
Kod formatlama örneği
// Before formatting  
void test(QString&data, bool extraString) {  
    int i=0;  
    for (i=0;i<3;i++) {  
        data+="reallylongstringtoproducealonglineasanexample" + QString::number(i * 1000) + "/filetoload.html";  
        if (extraString)  
        {  
            data += "some-extra";  
        }  
    }  
}  
  
// After formatting  
void test(QString &data, bool extraString)  
{  
    int i = 0;  
    for (i = 0; i < 3; i++) {  
        data += "reallylongstringtoproducealonglineasanexample" + QString::number(i * 1000)  
                + "/filetoload.html";  
        if (extraString) {  
            data += "some-extra";  
        }  
    }  
}  

Yukarıdaki örnek, clang-formatın kodu nasıl formatladığını gösterir. Formatlama kuralları ekip stiline göre serbestçe ayarlanabilir.


clang-formatın sorunları

clang-format harika bir araçtır, ancak mevcut kod ve commit geçmişi açısından sorunlara yol açabilir.

Başlıca sorunlar
  1. Mevcut kodla çakışma
    Tüm dosyayı formatladığınızda, formatlamayla ilgisiz bölümler de değişerek gereksiz değişiklikler oluşur.
  2. Commit geçmişinde karmaşa
    Büyük çaplı formatlama değişiklikleri commit geçmişini karmaşıklaştırabilir ve branch birleştirme, code review ve kod analizi süreçlerini zorlaştırabilir.
  3. Yeni kod ile mevcut kod arasında tutarsızlık
    Zaten formatlanmış bir koda yeni kod eklerken formatı korumak zor olabilir.
Çözüm: git-clang-format

git-clang-format, formatlamayı yalnızca değişen kodlara uygulamaya yardımcı olan bir Git genişletme aracıdır. Bunu kullanmanın avantajları şunlardır:

  • Formatlama kapsamını en aza indirme: Yalnızca değişen kodlara formatlama uygulama
  • İncelemeyi sadeleştirme: Formatlama değişiklikleriyle geliştirme değişikliklerini ayrı ayrı inceleyebilme

git-clang-format kullanım şekli

Kurulum

git-clang-format, clang-format-node paketiyle birlikte sunulur. clang-format-git npm paketini kurarak kullanabilirsiniz.

Temel iş akışı
  1. Kodu yazın.
  2. Değişiklikleri staging alanına ekleyin (git add).
  3. git-clang-formatı çalıştırın.
Örnek
# Yeni dosya ekle ve değişiklikleri stage et  
$ git diff --staged  
diff --git a/x.cpp b/x.cpp  
new file mode 100644  
index 0000000..af14ed5  
--- /dev/null  
+++ b/x.cpp  
@@ -0,0 +1,3 @@  
+int main() {  
+  
+}  
  
# git-clang-format çalıştır  
$ git-clang-format  
changed files:  
    x.cpp  
  
# Formatlamadan sonra durumu kontrol et  
$ git status  
On branch master  
Changes to be committed:  
    new file:   x.cpp  
Changes not staged for commit:  
    modified:   x.cpp  

Bu iş akışı sayesinde formatlama değişiklikleriyle geliştirme değişikliklerini birbirinden bağımsız olarak inceleyebilirsiniz. Formatlama değişikliklerini beğenmezseniz git checkout ile geri alabilirsiniz.

Stil belirtme

Formatlama stilini ayarlamak için --style seçeneğini kullanabilirsiniz.

$ git-clang-format --style=WebKit  
$ git-clang-format --style=file  # `.clang-format` dosyasını kullan  

Sonuç

clang-format güçlü bir araçtır, ancak gerçek iş ortamında yalnızca clang-format -i komutu çoğu zaman yeterli olmaz. Formatlamayı yalnızca değişen bölümlere uygulayan git-clang-format kullanıldığında kodu verimli şekilde yönetebilir ve inceleme sürecini sadeleştirebilirsiniz.

git-clang-format yalnızca değişiklikleri formatladığı için, temiz ve profesyonel bir kod tabanını korurken esnek bir geliştirme ortamı da sağlar. Çalışma commit’lerini veya tüm branch’i formatlarken birkaç ek Git komutuyla formatlama sorunlarını kolayca çözebilirsiniz.


Uzun yazıyı okuduğunuz için teşekkür ederim! GeekNews okurlarının hepsine mutlu yıllar🙇‍♂️

2 yorum

 
dooboo 2025-01-26

Beğenimi bırakıp geçiyorum

 
beenzinozino 2025-01-27

Teşekkür ederim!!