Programlamadaki herhangi bir şey gerçekten kötü mü? [kapalı]


41

Yani, sorulan görünen bir sürü soru var X kötülük, Y kötülük.

Benim görüşüme göre, dil yapıları, algoritmalar ya da neyin kötüsü olursa olsun, sadece kötü kullanılanlar yoktur. Cehennem, yeterince sert bakarsanız , goto'nun geçerli kullanımları bile vardır .

Öyleyse mutlak kötülük, bu, her durumda en iyi uygulamalarla tamamen uyumlu olmayan bir şey mi, programlamada var mı? Ve eğer öyleyse ne? Yoksa bir programın ne zaman uygun olduğunu bilmemesi kötü mü?

Düzenleme: Açık olmak gerekirse, programcıların yaptığı şeyler hakkında konuşmuyorum (dönüş kodlarını kontrol etmemek veya sürüm kontrolünü kullanmamak gibi - kötü programcılar tarafından yapılan seçimlerdir), araçlar, diller, ifadeler, hangisi ne olursa olsun kötü...


21
Null kötüdür! Milyar Dolar
Hatası Yanlışlıkla

22
@Amir Resaei, kaydetme sırasında değeri bilmediğiniz takdirde null gereklidir! Boşları kullanarak etrafta dolaşmanın yolları çok daha kötü.
HLGEM

4
@HLGEM: Haskell'in "Belki" gibi seçeneklerinin nasıl "daha kötü" olduğunu paylaşır mısın?
LennyProgramcılar

24
Günde 200 tekrar kapağı gerçekten kötüdür.

4
@ HLGEM: Bu, mevcut SQL veritabanları için doğru olabilir, programlama dilleri hakkında konuştuğumuzu sanıyordum.
LennyProgramcılar

Yanıtlar:


46
  1. Sihirli sayılar.
  2. Kapalı olma doğal olarak kötüdür ve işte bunun nedeni:

8
1. Onlara sahip olmak için sebep vardır. 2. Haskell'deki tip çıkarımı, sevdiğim bir çeşit suçluluk türü.
Matt Ellen,

1
Sihirli sayılar için +1, çok büyük bir şirkette hayatımın acısı. Ayrıca, "uzak geçmişte kaybolmuş" nedenleri, 1024 yerine 1000'e kadar ölçeklemenin nedenleri, kritik bir döngüde herkesin ortadan kaldırılmaya korktuğu için, başka neyin etkileneceğini bilmedikleri için çok büyük bir ek yüke yol açtı.
geekbrit

7
Meh, dolaylılık bazen çok temizdir. Açıklık, montaj programcıları içindir.
Macke

6
Re # 2: Orada ne yaptığını görüyorum.
Larry Coleman

5
@Larry, şaka aldım. Sadece katılmıyorum.
JSB ձոգչ

77

Programlamada gerçek bir kötülük yoktur.

<Rant>

Birçok insanın kötü şeylerin olduğunu düşünmesinin nedeni, programlama derslerini ilk aldıklarında kafalarına çarpılmasıdır. "Goto kullanmayın! Daima veritabanlarınızı normalleştirin! Asla, asla çoklu miras kullanmayın!" Bunlar, “kötülük” uygulamaları, kötüye kullandıkları için değil, çok kolay bir şekilde kötüye kullanıldığı için dövülmüşlerdir. İlk başta "asla" diyerek kurtulmak için bunlardan çok az fayda var. Gerçekten de kötülük, “En iyi uygulama” olmayan bir şeyi düşünmek için hiçbir neden yoktur ”diyor, çünkü her zaman bu şekilde mükemmel olan bir yer vardır .

</ Rant>


10
+1 - En iyi uygulama bir genellemedir ve tüm genellemeler için istisnalar olacaktır.
Jon Hopkins

1
++ Senin ranttan ikinciyim. Bravo!
Mike Dunlavey

3
+1: Bir süre önce, üzerinde çalıştığım bazı C kodlarına yeni bir goto ekledim. Yenilemekten daha hızlıydı. Ayrıca programcı olan karıma, "Tatlım, iyi misin? Ateşin var mı?" Diye sordum. Şu anda başka bir adamın bir döngünün ortasına atlayan bir C goto yazdığı bazı kodlar üzerinde çalışıyorum. Asla kendim yazmam ve onu her gördüğümde kendi içime küfrederim, ama nihai testi yerine getiriyor: işe yarıyor.
Bob Murphy,

1
+1 - Okuldan hemen sonra "goto exit" veya "goto error_exit" 'in sıkça kullanıldığı bazı C kodları üzerinde çalıştım. Daha temiz görünümlü kod için yapılmış, birden fazla iade ifadesine sahip olduğunu söylemek zorundayım. Benim sloganım, her şeyin bir yeri olduğu. (hatta singleton ;-))
eSniff

1
@JonHopkins - bu yüzden "iyi uygulamalardan" bahsetmeyi tercih ederim.
Richard

58

Silahlar insanları öldürmez, insanlar insanları öldürür.

Aynı şekilde, geliştirme araçları kötü değildir, programcıların onlarla yaptığı şeyler olabilir.


1
Bu harika bir benzetme.
Maxim Zaslavsky,

14
Silahlar insanları öldürmez. Mermiler yapar. :)

4
Silahlar, insanların insanları öldürmelerine yardımcı olmak için uzun bir yol kat ediyor. Daha da kötüsü, yapmaya çalıştığınız noktayı anlamıyorum: kim bu aletlerin kötü olduğunu iddia etti ?! Çok fazla oy aldığı için bu cevapta akıllıca bir şeyler olmalı. Ama ben onu tam olarak göremiyorum.
Konrad Rudolph

1
Rezene mermileri insanları öldürmez, insanlar insanları öldürür. makineler nihayet duygulanmadıkça, bu durumda sığınağımda olacağım.
antony.trupe

5
Silahlar insanları öldürmez, rapçiler öldürür.
Jon Hopkins

36

Programlamadaki herhangi bir şey gerçekten kötü mü?

Kesinlikle. Beyninizi kullanmamak ve ne yaptığınızı düşünmek ve neden yaptığınızı düşünmek tüm programlama kötülüğünün köküdür .


2
+1. Fakat bunun hakkında düşünmek / anlamak / ve bunun daha da iyi olacağını düşünüyorum.
Richard

Einstein'a göre insan salaklığı sınırlı değil.
Nils,

25

Boş genel istisna işleyicileri, yani:

catch(Exception ex)
{
}

Birinin bana geçerli bir kullanım davası verebileceğinden şüphem yok - ama dürüst olmak gerekirse, ciddi bir yaratıcı olacak ... ve en azından bir açıklamaya ihtiyacınız olacak.


1
+1 Başkası olmasaydı bunu ekleyecektim
Conrad Frix

1
Gerçekten mi? "Bunun başarısız olup olmaması umrumda değil" hiçbir zaman geçerli değil, hiçbir koşulda geçerli değil mi? Yapılan her şeyin, özellikle küçük yük atma tesislerinde başarılı ya da başarısız olacağı garanti edilmek zorunda değildir. İlk düşünmeyen bir başka durum da gerçek kötülük.
SilverbackNet

4
Bunu eski kodda görüyorum. . Zaman. Daha kötüsü, değiştirdiğimde insanların beni sorgulamaları.
George Stocker

5
Öncelikle bana bir "boş yakalama bloğu isabeti" tipi istisnası gönderen bir e-posta bildirimi ekliyorum ve prod olarak serbest bırakarak böylece yakalamanın gerçekte orada olduğunu ve hangi şartlar altında olduğunu görebiliyorum. Sonra tamir ederim.
CaffGeek

2
Java’da kontrol edilen istisnalar için oy kullanırdım: D
Nils

19

Belki soruyu tersine çevirebilir ve programlamada kesinlikle ve tamamen iyi bir şey olup olmadığını sorabilirim ? Bir şeyi düşünemiyorsanız (bilmeyeceğimi biliyorum), o zaman kötülük kavramı da aynı derecede çamurlu.

Hatalara, yanlış anlamalara ve diğer genel kafa karışıklıklarına yol açan ortak davranışlar vardır - fakat X dilinin doğası gereği kötü olduğunu söylemek, X özelliğinin amacını gerçekten anlamadığınızı kabul etmek anlamına gelir.

Çok fazla gönül yarası kurtaran ve bazı yanlış anlamaları önleyen ortak davranışlar vardır - fakat Y'nin doğal olarak iyi bir dil özelliği olduğunu söylemek, Y özelliğini kullanmanın tüm etkilerini tam olarak anlamadığınızı kabul etmek demektir.

Biz sonlu anlayışı olan insanlar ve güçlü görüşler - tehlikeli bir kombinasyon. Abartma, düşüncelerimizi ifade etmenin, kurgu haline gelinceye kadar gerçekleri açıklamanın bir yoludur.

Bununla birlikte, sorunlara neden olan davranışlardan kaçınabilir ve onlardan kaçınan davranışları takip edebilirsem, biraz daha üretken olabilirim. Günün sonunda hepsi bu.


3
programlamada kesinlikle ve mükemmel bir şey var mı? Açık, iyi yazılmış belgeler?
James,

4
@James Açık, iyi yazılmış belgeler genellikle okunamayan bir kodun bahanesi için kullanılır ve fazla kullanıldığında kodla birlikte bakımı yapılması gereken zincirler haline gelebilir. Açık, iyi yazılmış, ancak tamamen güncel olmayan belgeler de saf kötülük haline gelebilir.
Eugene Yokota

Çalışma kodu !!!
Scott Whitlock

Nedenini açıklayan bir yorum. Bu iyi.
Tim Williscroft

Birkaç farklı geliştiriciye aynı kodun iyi veya kötü olup olmadığını sorun ve farklı cevaplar alacaksınız. Öyle söylemek için kesinlikle daha sonra iyi biraz yanlış olur.
Berin Loritsch

13

Akla yayılan tek şey şudur:

#DEFINE TRUE FALSE
#DEFINE FALSE TRUE

Ama bir kez daha, bu sadece düz eski suiistimal hehe.


3
Bu makro her şeyi YANLIŞ ve DOĞRU DOĞRU yapar?
Görünen Ad

2
@bold: Aslında birkaç yıl önce buna rastladım; Bazı bozuk makro tanımları sayesinde hem DOĞRU hem de YANLIŞ aynı değere göre değerlendirilir (0, IIRC). İlginç bir öğleden sonra için yapılmış .
John Bode

1
@ bold Veya bunun tersi mi?
Mateen Ulhaq

11

Sanırım, sürekli olarak sisteme oturan otomatik güncelleyiciler, dosya ilişkilerini kaçıran uygulamalar ve diğer sistem ayarları bence çok kötü.

Sadece flash web siteleri ile birlikte.


10
Yani bana Adobe'nin şeytan olduğunu mu söylüyorsun?
David Murdoch

10
@David: Ne, bunu zaten bilmiyor muydun?
Mason Wheeler

8
Dosya ilişkilendirme kaçırma için en kötü suçlu QuickTime olduğunu söyleyebilirim.
Aralık'ta

Bir anlığına RealPlayer hakkında konuştuğunuzu sanıyordum. (
VLC'nin

2
Adobe ve Apple'ın yaptığı her şeyin şeytani olduğu sonucuna varıyorum.
Brian Knoblauch

10

Sadece tesadüfen işe yarayan her şey doğal olarak kötüdür.

Varsayılan derleyici seçeneklerini kullanarak makinemde gerçekten çalışan aşağıdaki C programını göz önünde bulunduralım:

#include <stdio.h>
int main(int argc, char *argv[]) {
   char string[10];
   int y;
   for (y=0; y<10; string[12]++) {
      printf("%d\n", y);   
   }
}

Hiçbir şey, gerçekten hiçbir şey bu programın döngü sayacını artırma şeklini asla mazeret edemezdi. Makinemde, derleyicimde ve varsayılan seçeneklerimde doğru olanı yapan sadece tanımsız bir efekt.


Güzel. İyi örnek - çözmem bir saniye sürdü! Güzel.
Michael K

5
Bence bu doğal olarak kötülükten daha doğal olarak yanlış .
Lawrence Dol

Biçim dizgisindeki yazım hatası düzeltildi
user281377

3
Mel gurur duyardı.
Barry Brown

Bence oldukça havalı, hemen hemen aynı şekilde assembler çağrılarındaki veri yapılarını bindirmek için yapıların kullanıldığı gibi. Belli ki burada kasıtsız, ama sonra örnek için istedin. Güç, düzgün kullanmak için avaraya kadar bozuluyor. NB. Bu mükemmel bir röportaj sorusu olur.
Aralık'ta

10
Öyleyse mutlak kötülük, bu, her durumda en iyi uygulamalarla tamamen uyumlu olmayan bir şey mi, programlamada var mı? Ve eğer öyleyse ne?

Evet; standart C kütüphanesi işlevi gets(). C standartları komitesinin resmi olarak onaylamamış olması ve standardın bir sonraki versiyonundan çıkması bekleniyor. Bir kütüphane çağrısının neden olduğu kargaşa, 30 yıldan fazla süren eski kurallara aykırı olma ihtimalinden daha korkunç - işte bu kadar kötü.


Konuşamayan bizler için neden bu kadar kötü olduğunu açıklamaya özen gösterelim?
Jon Hopkins

8
gets()bir tamponun adresi olan tek bir argüman alır. Karakterler standart girdiden yeni satır görünene kadar arabelleğe okunur. Çünkü bütün aldığı tamponun adresi, tamponun gets()ne kadar büyük olduğu hakkında hiçbir fikri yok. Arabellek 10 karakter için boyutlandırılmışsa ve giriş akışı 100 içeriyorsa, bu fazla 90 karakter arabellekten hemen sonra belleğe yazılır ve potansiyel olarak yığını gizler. Sonuç olarak, bu tercih edilen bir malware kullanımıdır. Tasarım açısından güvensiz ve güvensizdir .
John Bode,


7

Öyleyse mutlak kötülük, bu, her durumda en iyi uygulamalarla tamamen uyumlu olmayan bir şey mi, programlamada var mı?

Tabii ki değil. Araç kutumdaki herhangi bir şeyin kötü olup olmadığını sormak gibi. Dört yaşındaki çocuğum eline geçmezse, çekiçim benim için harika bir "iyi" dir.


Yeteneklerini tam olarak kullanan yaşlı bir adam onu ​​iyi birşeye zarar vermek için kullandığında daha da kötü olduğunu düşünüyorum.
guiman


6

Çok ciddi olmamak, ama ...

Kötülük hakkında çok miyop görüşlerimiz var. Başka birçok insanı öldüren insanlar kötüdür. Başkalarından çalan insanlar kötüdür. Her milletin (bildiğim) geçmişlerinde bazı kötülükleri vardır. Bazıları inkar etmek istiyor.

Programlamada kötülük var mı? Biz masum programcıların "gerçekten değil" olduğunu düşünebiliriz. Ancak, bir zamanlar bu konuda geniş çapta kullanılan hiyerarşik bir veri tabanının mucidi ile konuştum. En iyi müşterilerden birinin kim olduğunu bilmek ister misiniz? Komünist Polonya'nın gizli polisi.

Şimdi dünyada kötülük var mı? Emin ol. Ve programcıları kullanıyorlar mı? Emin ol.


2
Muhtemelen düşündüğümden daha kötü bir kötülük çeşididir. Gizli polise kıyasla, biz gerçekten sadece yaramaz konuşuyoruz.
Jon Hopkins,

@Jon: ... ve bu sezonda herkes "yaramaz" ve "güzel" birlikte gider :) bilir
Mike Dunlavey

Soykırım her zaman gerçekten kötüdür, hırsızlık konusunda farklı hissediyorum. Çalma, başkalarını incitmesine rağmen niyet değil, kendi sonuçlarını geliştirmek. Hırsızın, kime çaldıklarını incitmeden, sonuçlarını kolayca iyileştirebilmesi. Ben bu ahlaksızlığı düşünüyorum, ama gerçekten de kötü değil
JD Isaack,

@John: Robin Hood? Ne demek istediğini biliyorum. Aslında, Pareto Verimliliği bununla ilgili, sanırım. Bugün popüler teorinin zıttı. OMG, umarım bu bir alev savaşı başlatmaz ...
Mike Dunlavey

@John Isaacks - Yani diyorsunuz ki, bir saatte 6,000 dolar yapan bir hırsızın ortalama bir programcıdan bir araba çalarak 6,000 dolar kazandığını söylüyorsunuz, yani iki ay 6,000 dolar kazanmak için sadece "dengesizliği düzeltmek" mi ?! Ya da söz konusu hırsız gibi bazı insanların basitçe diğerlerinden daha iyi olduklarını varsayarlar, bu yüzden çok çalışmak zorunda kalmazlar mı?
Jas

6

Boş, Kötülüğün köküdür!

https://softwareengineering.stackexchange.com/questions/22912/null-references-the-billion-dollar-mistake-closed

Milyar Dolar Hatası:Milyar dolarlık hatam diyorum. 1965'teki boş referansın icadıydı. O zamanlar, nesne yönelimli bir dilde (ALGOL W) referanslar için ilk kapsamlı tip sistemi tasarlıyordum. Amacım, derleyici tarafından otomatik olarak yapılan kontrollerle referansların tüm kullanımının kesinlikle güvenli olmasını sağlamaktı. Ancak boş bir referans verme eğilimine karşı koyamadım, çünkü uygulanması çok kolaydı. Bu, son kırk yılda muhtemelen bir milyar dolarlık acı ve hasara neden olan sayısız hata, güvenlik açığı ve sistem çökmesine neden oldu. Son yıllarda, referansları kontrol etmek ve boş olma riskleri varsa uyarılar vermek için Microsoft'ta PREfix ve PREfast gibi bir dizi program analizcisi kullanılmıştır. Spec # gibi daha yeni programlama dilleri boş olmayan referanslar için beyanlar getirmiştir. 1965'te reddettiğim çözüm bu oldu. CAR Hoare, 2009


Amir, açıkçası pek çok insan bunu anlamadı (HLGEM'in sorunun altındaki yorumunda ve aldığın oy sayısının azlığında olduğu gibi). NULL olabilecek referanslar bizim düşüncemize o kadar gömülü olduğu için, gerçekten doğal olmadıklarını anlamak zor olabilir. Belki de alternatiflerin nasıl çalıştığını açıklamalısınız ya da en azından bunu yapan makalelerle bağlantı kurmalısınız. - Eğer insanlar cevabınızı anladılarsa, yaptığınız puan% 100 geçerli olduğundan, burada en üst sıralarda yer alacağından eminim.
Konrad Rudolph

@Konrad Rudolph Bu konuda gönderdiğim "Boş Referanslar, Milyar Dolarlık Hata" başlığı altında cevaplar var. Null desteğini kaldırmış diller var.
Amir Rezaei

Üzücü gerçeği + 1, çoğu programcının alternatifler hakkında hiçbir fikrinin olmamasıdır. Boş referansların varlığına karşı değilim , sadece bir anlamı olduğu görüşüne . Bu sadece geçersiz bir hafıza konumuna işaret eden bir işaretçidir - daha fazlası değil. Çoğu programcı, etki alanında bir anlam ifade eder (örneğin, orta ad alanı gerekli değildir, bu nedenle boş olabilir). Programlarımda null , dil belirtiminde belirtilenlerin üstünde ek bir anlam ifade etmiyor. Bana göre boş bir referans her zaman bir hatadır. Bir alan isteğe bağlıysa, uygun seçenek türünü kullanırım.
MattDavey

@AmirRezaei: İşaret etmeleri için yararlı bir şey olmadan önce ortaya çıkan referanslarla neler yapılmalı? Bu tür referansların, açıkça yasal olarak değiştirilemeyen, ancak yasal olarak değiştirilemeyen bir nesneye işaret etmelerine gerek duymak yerine açıkça düzenlenemeyen bir şeye işaret etmesinin daha iyi olacağını düşünüyorum. Bazı zamanlar, bir şeyleri görmeden önce başlatılmalarını gerektiren bir şekilde beyan edilmiş referansları bulundurmak, her zaman böyle olmasını gerektiren tavuk ve yumurta problemleri yaratabilir.
supercat

6

Kopyala-yapıştır kodu.

Bunu yaparken kaşınmazsan, gerçek bir programcı değilsin.


2
Cevabın içinde örtük: tüm gerçek programcılar zaten copypasta yaptılar, bu yüzden nasıl hissettiğini biliyorlar ...
Şubat'ta 12:12

5

Donald Knuth'un ifadesini şahsen buluyorum: "erken optimizasyon tüm kötülüğün kaynağıdır", programlamadaki ilk kötü şey olarak. Süresiz bir bakış açısına göre (bunun için başarısız olduğumu söylüyor).

Aslında, cümle şöyle bir şey söylüyor: Sorunu derinlemesine almadan önce, sorunu belirli bir ortamda, belirli bir PC'de veya kullanıcı grubunda anlamaya çalışmayın.


4

Hiç kimsenin Globals'ı gerçek bir kötülük olarak taşımamasına şaşırdım. Parametreler hakkında hiçbir fikrinizin olmadığı bir ortamda programlama yapmanın daha iyi bir yolu yok ve onlara ne olduğu üzerinde neredeyse hiçbir kontrol yok. Kaos! Tüm kodlamamda global değişkenlerin kullanımı konusunda katı bir yasaklama var.


+1000 Yapabilseydim bunu daha yüksek kullanırdım. Günümüzde programlamada tek büyük sorun. Ve sayısız makale, diyalog ve çaba, insanları problem hakkında eğitmeye gider ve hiç değişmeyeceğini sanırım. Herkes yeni başlayanlar olarak kullanmaya başlar ve nadiren onlarla ilgili bir sorun görür. Profesyonel bir ortamda bulduğum hemen hemen her proje fazla kullanılan kürelerden muzdarip (eksi Bahar tabanlı projeler - çoğunlukla). Her ne kadar bir Bahar projesinde BlahBlahManager.getInstance () 'ı bulduğunda onu sevmelisin. Kitabı aldım, hala anlamadım.
chubbsondubs

6
Bana küresel olmayan önemsiz bir uygulama bul. Ah, sarılırlar, düzenli olurlar ve korunurlar ve sınıfta ve bir çerçevede ve genellikle daha iyidirler ... ama uygulama için sadece bir tane varsa, bu oldukça küresel bir şey. Meselenin uygun olmayan şekilde kapsamlaştırılmış değişkenlerle kullanılması.
Murph

2
Global değişkenler böyle kötü bir ünü hak etmiyor. @ Maurph'in dediği gibi, bazı şeyler küreseldir . Dosya sistemi geneldir (tüm işlemler aynı şekilde kullanılır); işleminiz tüm iş parçacıkları için küresel; bellek küreseldir (başka bir işlem, belleğinizi güvenle kullanabilir ve bellek paraşütünü güvenle kullanırken sizi çökertebilir); kullanıcı kendisi küresel (UI tasarım açısından düşünün). Doğası gereği global bir şeyleri global değişkenler olarak modellemek yanlış değildir - veya Singleton veya Service Locator veya belki Tescil.
kizzx2

3

Hiçbir alet kendiliğinden kötü değildir. Varlığı, tek kullanımlık bir durum dışında herkes için tamamen aptalca olabilir, ancak bu onu kötülük yapmaz. Programcının uygun kullanımına karar vermenin zorluğunu getirir.



3

Biliyorum bir yazı yazmayacağım ama bir cevap yazacağım. Herkesin dediği gibi hayır kötülük yok diyeceğim evet kesin mutlak kötülük var

Setjmp / LongJmp saf şeytandır.


1
+1 Setjmp / LongJmp için uygun bir kullanım vakasını henüz görmedim.
Oliver Weiler

@ Yardım Yöntemi: haha, teşekkürler. Birinin benimle aynı fikirde

4
try / finally / catch + throw, Setjmp + LongJmp ile gerçekleştirilir.
comonad

3
SetJmp + LongJmp, PTC'siz dilleri / derleyicileri kullanarak Kuyruk Çağrıları yoluyla CPS'yi (Devam geçiş tarzı) gerçekleştirmek için kullanılabilir (Uygun kuyruk çağrıları). Bu trampolining.see optimize edilmiş bir versiyonudur en.wikipedia.org/wiki/Tail_call#Through_trampolining ve en.wikipedia.org/wiki/Continuation#Kinds_of_continuations
comonad

1
Setjmp / longjmp'dan çok daha kötü, fakir bir adamın süper hafif iplik kütüphanesini uygulamak için setjmp / longjmp kullanıyor (DOS günlerinde çok eskiden gördüğüm gibi). Nefis kötülük kodu! :-)
Brian Knoblauch



2

Herhangi bir araç olabilir rağmen kullanılan iyiliği ve kötülük için, bazı araçlar şunlardır genellikle sürpriz programcılar kim onları sık sık kullanmayın çünkü kötülük.

32 bitten kısa olan tamsayılarla çalışırken, Java kötüsündeki imzasız sağa kaydırma operatörünü (>>>) düşünüyorum (şaşırtıcı derecede uygunsuz).

Diyelim ki -1 değerinde bir bayt var.

byte b = -1;  // binary: 1111 1111

İmzasız sağ kaydırma operatörü, sıfırları en soldaki bitlere kaydırır. Yani kişi 1 ile sonuçlanacak 7 ile bir kayma olduğunu varsayar.

b >>>= 7;  // binary: 0000 0001 ?

Ancak bunun yerine bu işlem hiçbir şey yapmaz. b hala -1.

Aşağıdaki 25 vardiya bile olsa hiçbir şey yapmaz:

byte b = -1;
for (int i = 0; i < 25; ++i) {
    b >>>= i;
    System.out.println(b); // always outputs -1
}

Bu olur çünkü b>>>=7kabaca çevirir

                                  1111 1111

1) the byte gets widened to a 32 bit int to make shifting possible
    1111 1111 1111 1111 1111 1111 1111 1111

2) the shift happens
    0000 0001 1111 1111 1111 1111 1111 1111

3) the resulting int gets narrowed to a byte again
                                  1111 1111

Değiştirmek zorunda kalacaksın

b >>>= i;

tarafından

b = (b & 0xFF) >>> (i % 8);     // >> would also work this time

'beklendiği gibi' çalışmasını sağlamak.


1
Java bilmiyorum ama neden bu şeytan? sadece girişlerde kullanılması gerektiğini mi söylüyorsun ve byte int değil mi? D> 'nin -1 ile sonuçlanmaması gereken imzasız kayma hakkı olduğunu bildiğim için tuhaf ama>> buluyorum.

@ acidzombie24 Kesinlikle doğru. >>> imzasız bir vardiya ve >> imzalı bir vardiyadır. Ancak bir baytı kaydırırken ilk önce bir int (genişletilmiş işareti ile doldurulur) ve sonra kaydırılır. Yani 'imzasız' değişim bile işareti ile genişletiyor. Aslında sonuç pozitif bir int ama bir byteta sakladıktan sonra tekrar negatif.
Robert

Whoa, bu bir çeşit kötülük. Ya da en azından istenmeyen sonuçları size verme olasılığı çok yüksektir. Sadece bir bayt değişimini uygulayamayacağını düşünüyorum. bir int ve geri dönüştürmüyorsa ... iyi değil.

@ acidzombie24 Bayt ile herhangi bir işlem yapmanın makine kodu yoktur (yükleme / saklama hariç). JVM seviyesinde 32 bit en küçük birimdir. Bu yüzden bütün iş ya derleyici ya da programcı tarafından yapılmalıdır. Derleyici değişmeyecek. Gerekli düzeltmeyi gönderime ekledim.
Robert,

2

Bunu tersine çevireceğim ve mutlak bir kötülük olmasa da, diğerlerine göre böylesine sınırlı bir kafatası boyutuna sahip, zayıf insanlarımız için daha mantıklı hale getiren araçlar ve yapılar olduğunu söyleyeceğim .

Bu yüzden , insanların bir hata yapma ihtimaline bağlı olarak bir yapının kötülüğü hakkında konuşabileceğinizi söyleyebilirim . Ekmeği bir bıçakla veya bıçaklı zincirli bir testere ile kesebildiğinizden emin olun, ancak yeterince dikkatli bir şekilde çekebilseniz bile, birinin diğerinden daha fazla hasara neden olma olasılığı yüksektir.


2

Ana dilinizde kodlayın (İngilizce değil), belgelerinizi ana dilinizde yazın. Ardından projeyi bir Hintli şirkete dış kaynak olarak veriniz.

Bu senin için kötülük!

Not: Kayıt için, oldu ve Kızılderililer çok komik bulmadılar.


1
Belki de işlerini projeye başlamadan önce anlayabilecekleri bir şekilde yapmaları gerekirdi ...
Merlyn Morgan-Graham

Bunu nasıl beklerler? Küresel anlamda ingilizce olmayan kod / belgelere sahip olmanın iyi olduğunu düşünüyor musunuz?
k25,

1

Süreklilik söylemeye cazip geliyorum ama bence doğru cevap programlamada nesnel ve mutlak bir kötülük olmadığı. Öte yandan, en iyi araçlar bile kötüye kullanılabilir.


Pek çok insan sürekliliği anlamaz, daha az kapsamlı bir şekilde kullanma şansı oldu. Sizi kötü olduğuna ikna eden hangi durumlarla karşılaştınız? Sürekliliklerin oyunu gerçekten değiştirdiği bir örnek, özellikle kullanıcı arayüzünün donmaması için pompalama olaylarını sürdürmeniz gereken kullanıcı arayüzü programlamasında asenkron programlamadır. Eşzamansız programlama her türlü baş ağrısına neden olur çünkü yeniden kullanım, senkronize stil gelişiminde gerçekten iyi çalışır. Devamlılıklar senkronize stili geri yüklemek için kullanılabilir ancak UI'nin donmasını önler. Bu oldukça harika.
chubbsondubs

1
Sürekliliğin kötü olduğunu düşünmüyorum, ancak toplumda bol miktarda, bunları kullanarak yazılmış herhangi bir kodun otomatik olarak "zekice" olacağı düşüncesinde olabileceğini düşünüyorum.
Larry Coleman

1

Programlama, kendiliğinden, sanırım, doğası gereği kötü değildir. Ancak, programlama genellikle sosyal bir aktivitedir ve etrafınızdakilere saygısızlık etmek çok kötü olabilir. İnsanlar genellikle çoğu kodun başkalarıyla paylaşılacağını unutur; çoğunlukla okur, bazen de yazar. Açık kaynak olmalı, bir şirketin piyasaya sürdüğü bir ürün ya da bir danışman için küçük bir parça yaması işe alınacak, programlar okunacak.

Bu, birçok "zararlı olarak kabul edilen" makalenin var olmasının ya da insanların "asla" deme nedeninin yarısıdır. Başkaları için hayatı zorlaştırmak tüm kötülüklerin kökenidir. Öyle değil mi?


1

Evet, olması gereken çok şeytan var. Örneğin:

Type1 variable1 = function12()
variable5 = variable1.myMethod(variable1+aGlobal);
variable2.otherMethod(anotherGlobal);

1

Yetersiz toplam fayda için sistemin toplam maliyetini artırmak. Çok fazla kopyalama ve yapıştırma, çok karmaşık bir mimari veya pahalı ama etkisiz ticari ürünler kullanmak olabilir. Genel olarak konuşursak, tüm yazılım teknikleri bir sistemin toplam maliyetini düşürmeyi amaçlar ve aşırı pahalı bir sistemle sonuçlanırsak yanlış yaptık.

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.