İtirazın zararlı olduğu düşünülüyor mu? [kapalı]


27

Kendi -std=c++0xgenç kodumun bir kısmını GCC'deki bayrakla derledim, çünkü tüm genç insanların yaptıklarını (çimlerimde kalmaları şartıyla) belli belirsiz bir şekilde sürdürmek istiyorum. hakkında auto_ptrkaldırılmasına karar verildi. Tabii ki, bunun auto_ptrC ++ 0x ile kullanımdan kaldırıldığını biliyordum , ama ...

İtiraz, zaman ve emek kaybı değil midir? İtiraz etmeme nedenleri (örnek olarak auto_ptr ile):

  • Orada hala desteklenmesi gereken bir kod okyanusu var, milyonlarca uyarı üretmek insanları yalnızca uyarıları kapatmaya teşvik edecektir.

  • auto_ptr biraz naff, ama aslında teneke söylediklerini yapar.

  • Bir şeyleri gerçekten caydırmak istiyorsak, aday gösteririm printf(). Ancak, ortaya çıkacak olan sesleri hayal edin. auto_ptrçok fazla arkadaşı yok, ama en azından benim C ++ kodumda hiç kullanılmadığından daha fazla printfkullanılıyor.

  • komitenin bu hakkı alma konusunda kötü bir sicil kaydı var - isim alanı kapsamında statik bıraktılar ve şimdi daha önce görülmemiş gibi görünüyorlar - auto_ptrbenzer bir geri dönüş yapılırsa şaşırmam

  • Son olarak, komite ne söylerse söylensin derleyici uygulayıcıları onları görmezden geliyorlar - sadece müşterilerin kodlarını ihlal etme riskini göze alamazlar, yapabilecekleri tek şey rahatsız edici uyarılar yayınlamak.

Öyleyse benim sorum - itiraz (herhangi bir şeyin, sadece auto_ptrs değil ve sadece C ++ 'da değil) iyi bir fikir olduğunu düşünüyorsunuz ve öyleyse neden?


2
@TheLQ - "Neden bir şeyi amorti edersiniz" olarak okudum, ama auto_ptrbir örnek olarak kullanıyorum .
ChrisF

4
“neredeyse her tür kapta kullanılırsa kalbini kıracak” mı? Kullan unique_ptrve daha mutlu ol.
Kate Gregory

13
@Neil - Diliniz biraz iltihaplıdır ve (yansıma üzerine) ciddi bir sorudan çok daha rantla karşılaşır. Açık kalmasını istiyorsanız "sesini kısmak" isteyebilirsiniz.
ChrisF

4
@Neil - Mizahi gibi tasarladığın için minnettarım ama dediğim gibi, yansıma üzerine düşündüğümden daha fazla "hiddet" geldi.
ChrisF

10
Eğer herhangi bir itirazdan kurtulmayı planlıyorsan, önce onu gerçekten reddetmelisin. Aksi halde birçok dil / API kırılabilir. İtirazınızla, kendi kullanımdan kaldırılmalarından kurtulmaları için onlara biraz zaman verebilirsiniz.
Joachim Sauer,

Yanıtlar:


32

Değer düşüklüğünün sebepleri (genel olarak):

  • İnsanlara bir şeyin kötü bir uygulama olduğunu açıkça gösterir (ve umarım bir alternatif önerir).
  • İtfa süresi, insanlara derleyici dürüstçe kaldırmadan önce kodlarını değiştirme şansı verir.

Ayrıca son konu hakkında da hemfikirim. Derleyiciler komiteyi görmezden gelmezler ve nihayetinde onaylanmayan şeyleri kaldırırlar (örneğin >?=ve <?=GCC’de çıkarıldılar - sonra kaldırıldılar *).

Bence asıl mesele şudur: bazı sebeplerden dolayı bazı şeylerin kaldırılması gerekir ve bence bu itirazın bunu yapmanın tek akılcı yolu. Bu özel durumda, auto_ptryerini aldığı haliyle kaldırılmalıdır unique_ptr. Değişmek yeterince kolaydır ve insanların bunu yapmak için bolca vakti olacaktır.

(*) Evet, uzantı olduklarını ve standart olmadıklarını biliyorum, ancak nokta, derleyici satıcılarının kodun bunlara dayanıp dayanmadığına bakılmaksızın, artık kullanımdan kaldırıldıktan sonra bir şeyleri kaldırdıkları anlamına geliyor.


6
Offtopic için üzgünüm ama dayanamıyorum: Bunlar >?=ve <?=operatörler neydi?
brandizzi

7
Eski GCC’de a >?= b;bunun için steno if (a > b) a = b;ve benzer şekilde yazabiliyordunuz <?=.
Peter Alexander

2
Ugh ... Neden eklediklerini anlayabiliyorum. Ve sonra neden kaldırdılar. Kamuoyuna serbest bırakıldıktan sonra ne kadar sorunlu olduklarını ortaya çıkaran "temiz" özellikler için itiraz gerekebilir.
Phil

25

Yeterince karmaşık olan herhangi bir API muhtemelen bir süre kullanılıncaya kadar keşfedilmemiş kusurlara sahip olacaktır. Seçeneklerimiz:

  • Bir şeyleri olduğu gibi bırakın. Bu, API'nin zaman içinde geliştikçe daha fazla zulüm toplamaya devam edeceği anlamına gelir. Yeni ve geliştirilmiş sürümler eklense bile eskilerin de bakımlarının yapılması gerekir.
  • Uyarmadan çıkarın. Bunun çok fazla kod kırması olasıdır.
  • Kullanımdan kaldır ve sonraki bir sürümde kaldır. Bu, mevcut kodu düzeltmek için zaman kazandırırken, ham petrol miktarının sınırlı kalmasını sağlar.

İtiraz, bu alternatiflerin en kutsal olanıdır.


12

Hayır. İtiraz, gerçekten iyi bir şey olabilir. Teknolojilerin eski işe yaramaz bagajlara takılmasını engeller.

Sadece C ++ arenada, bir for ifadesinin içindeki değişken bildirimi doğru şekilde desteklemediğini Microsoft'un "özelliğini" hatırlıyorum. Bu yaklaşık on yıl devam etti ve pek çok kodun taşınması imkansızdı. Bu bir "özellik" sevindi sevindi.

Daha genel olarak, Apple, 80'lerden beri, tıka basa başlamadan önce 5-7 yıl boyunca "eski" API'leri "kullanımdan kaldırılmış" olarak işaretlemekten beri bir alışkanlığa sahipti. Ben sadece WWDC’de eski QuickTime C API’lerinin bazılarının kullanımdan kaldırılması hakkında bir Apple mühendisiyle konuşuyordum ve bunu yaptıklarını duymaktan gerçekten memnun oldum, çünkü 1990’da geliştirilen bir modele verilen desteğin ne yapabileceğini tamamen engelliyordu. Modern 64-bit çok çekirdekli işlemcilerde yapmak için.

Uygulamada, derleyici yazarlarının auto_ptr'i bırakmaları uzun zaman alacak ve muhtemelen bir veya iki on yıl boyunca geriye dönük uyumluluk modunu destekleyeceklerdir, ancak bu iyi bir şey imo.


11

Bir şeyleri gerçekten caydırmak istiyorsak, printf () 'i aday gösteririm.

printfyararlı bir fonksiyondur. İostreams'dan daha kısa olanları biçimlendirmeyi sağlar. Ve bu bir C işlevi. C ++ 'ın var olmasının ve kullanılmasının çok önemli bir nedeni C ile uyumlu olmasıdır printf.

Öyleyse, amortismana karşı bir haçlı seferinden başka biri var mı?

Komite, şu anki kullanımdan kaldırılma anlamının bazı sorunlarının farkındadır. İtirazın anlamını görün .


5

Dillerin ve API'lerin ilerlemesi gerekir. Bazı eski özelliklere bağlı olarak bir ton kod olsa bile, bir şey yapmanın yeni ve daha iyi bir yolu olabilir ve eski özelliği desteklemenin maliyeti çok fazla.

İtiraz, gelecekte özelliğin kaldırılacağı konusunda da uyarı verir. Bu, geliştiricilere, yeni API’ye ayak uydurmaları durumunda kodlarını güncellemeleri için zaman kazandırır. Bu alternatiften çok daha iyidir: düpedüz kaldırma. Amortismanın bir hata değil, bir uyarı olduğunu unutmayın.

Bu, güncellemek istemediğiniz eski bir programsa, eski API'yi (veya bu durumda derleyiciyi) kullanmanıza engel olan hiçbir şey yoktur.


1

Olduğu gibi, değer kaybının en az iki anlamı vardır.

  • Gelecekteki bir sürümde kaldırılacak
  • Daha iyi alternatifler ürettik ve şimdi bu özellik gereksiz (ancak tamamen işe yaramaz değil). Yeni başlayanlar dili öğrenirken bunu daha iyi atlarlar; ancak yakın zamanda kaldırılmayacak.

Bence statik ikinci kategoriye giriyor, ancak yalnızca zaman auto_ptr'nin gerçekten kaldırılmayı hak edip etmediğini veya dilde tutmanın daha iyi olup olmadığını söyleyecektir.


0

1 iş günü içinde bir alternatife geçiş yapılabilir ise amortisman zararsızdır: örn. eski işlevlerin basit bir şekilde aranması / yenisiyle değiştirilmesi veya uyumluluk katmanının kurulması kolaydır.

Yazılımın büyük bölümlerini, kullanımdan kaldırılması nedeniyle yeniden yazmanız gerekirse, zararlı olabilir.

İyi bir örnek muhtemelen PHP'nin mysql API'sı olacaktır, temelde tüm mysql_ * 'ı mysqli_ * ile değiştirmeniz ve onlara bir bağlantı kimliği sağlamanız gerekir.

Kötü örneklerden biri, glBegin, glEnd ve tüm matris hesaplama öğelerinin OpenGL'den kaldırılması ve kaldırılmasıdır. Kodunuzun OpenGL3 veya üzeri sürümlerde çalışmasını istiyorsanız, köşe arabelleğini kullanmak için tüm oluşturma kodunu yeniden yazmanız gerekir.


-1

İnsanlara daha iyi bir yol olduğunu bildirmenin iyi bir yol olduğunu düşünüyorum. Ben sadece kaybolan bir işlev yerine daha çok hoş bir mahrumiyeti tercih ederim.

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.