프로그래밍에서 정말 악한 것이 있습니까? [닫은]


41

따라서 X 악, Y 악이라고 묻는 많은 질문이 있습니다.

내 견해로는 언어 구성, 알고리즘 또는 사악한 것이 없으며 잘못 사용되는 것만 있다는 것입니다. 지옥, 당신이 충분히 열심히 보인다면 goto의 유효한 사용법 조차 있습니다.

그렇다면 절대 악은 모든 모범 사례와 완전히 호환되지 않는 것이 프로그래밍에 존재합니까? 그리고 그렇다면 무엇입니까? 아니면 무언가가 언제 적절한 지 모르는 것은 나쁜 프로그래머입니까?

편집 : 분명히, 프로그래머가하는 일에 대해 이야기하고 있지 않습니다 (예 : 리턴 코드를 확인하지 않거나 버전 제어를 사용하지 않는 것-나쁜 프로그래머가 선택한 것). 도구, 언어, 문장 등을 의미합니다. 나쁜...


21
널은 악하다! 억 달러 실수 프로그래머
.stackexchange.com / questions / 22912 /…

22
@Amir Resaei, reecord를 삽입 할 때 값을 알 수없는 경우 null이 필요합니다! 널을 사용하여 발아하는 방법은 훨씬 나쁩니다.
HLGEM

4
@HLGEM : Haskell의 "아마도"와 같은 대안이 "훨씬 더 나빠진"방법을 공유 할 수 있습니까?
LennyProgrammers

24
하루에 200 개의 캡을 사용하는 것은 정말 악합니다.

4
@ HLGEM : 이것은 현재 SQL 데이터베이스에 해당 될 수 있습니다. 프로그래밍 언어에 대해 이야기하고 있다고 생각했습니다.
LennyProgrammers

답변:


46
  1. 마법의 숫자.
  2. 내재 성은 본질적으로 악이며, 그 이유는 다음과 같습니다.

8
1. 그것들을 가질 이유가 있습니다. 2. Haskell의 형식 유추는 내가 좋아하는 암시의 유형입니다.
매트 엘렌

1
마법의 숫자는 +1, 매우 큰 회사에서 제 인생의 허무함. 또한, 1024 년 대신 1000으로 확장해야하는 "먼 먼 과거에 잃어버린"이유로 인해 영향을받는 다른 항목을 알지 못했기 때문에 모든 사람이 제거하기가 두려운 중요한 루프에서 막대한 오버 헤드가 발생했습니다.
geekbrit

7
Meh, 때로는 암시성이 매우 깔끔합니다. 명시는 어셈블리 프로그래머를위한 것입니다.
Macke

6
다시 # 2 : 나는 당신이 거기에서 한 일을 보았습니다 ... 죄송합니다.
Larry Coleman

5
@Larry, 나는 농담을했다. 나는 단지 동의하지 않는다.
JSB ձոգչ

77

프로그래밍에는 진정한 악이 없습니다.

<랜트>

많은 사람들이 악한 일이 있다고 생각하는 이유는 프로그래밍 수업을 처음들을 때 머리에 뭉개져 있기 때문입니다. "goto를 사용하지 마십시오! 항상 데이터베이스를 정규화하십시오! 절대로 다중 상속을 사용하지 마십시오!" 이러한 "악한"관행은 본질적으로 나쁘지 않기 때문에 쉽게 악용 될 수 있기 때문입니다. 처음에는 "never"라고 말하면 도망 갈 수있는 용도가 너무 적습니다. 무엇이 진정으로 악이 있기 때문에, "이 아닌 '모범 사례'는 무엇을 고려해야 할 이유가 없다"며입니다 항상 바로 그 방법은 완벽한 장소가.

</ rant>


10
+1-모범 사례는 일반화이며 모든 일반화에는 예외가 있습니다.
Jon Hopkins

1
++ 나는 당신의 분노를 두 번째로합니다. 브라보!
Mike Dunlavey

3
+1 : 잠시 후, 이미 작업중인 C 코드에 새로운 goto를 추가하여 이미 많은 코드를 가지고있었습니다. 리팩토링하는 것보다 빠릅니다. 나는 프로그래머이기도 한 아내에게 아내에게 물었다. "여보, 괜찮아? 열이 있니?" 나는 현재 다른 사람이 루프 중간으로 뛰어 드는 C goto를 작성한 코드를 작성 중입니다. 나는 그것을 직접 쓰지 않을 것이고, 그것을 볼 때마다 내면으로 저주하지만 궁극적 인 테스트를 충족합니다.
밥 머피

1
+1- "goto exit"또는 "goto error_exit"가 자주 사용되는 학교 밖에서 일부 C 코드 작업을했습니다. 여러 개의 return 문을 사용하는 것보다 깔끔한 코드를 만들었습니다. 나의 좌우명은 모든 것이 제자리에 있다는 것입니다. (심지어 싱글 톤 ;-))
eSniff

1
@JonHopkins-이것이 "좋은 관행"에 대해 말하는 것을 선호하는 이유입니다.
Richard

58

총은 사람을 죽이지 않으며 사람들은 사람을 죽입니다.

마찬가지로 개발자 도구도 악한 것이 아니며 프로그래머가 할 수있는 일도 마찬가지입니다.


1
그것은 훌륭한 비유입니다.
Maxim Zaslavsky

14
총은 사람들을 죽이지 않습니다. 글 머리 기호 :)

4
총은 사람들이 사람들을 죽 이도록 돕는 데 큰 도움이됩니다. 더 나쁜 것은, 나는 당신이 만들고자하는 요점을 이해하지 못한다 : 누가 dev-tools가 악하다고 주장 했습니까?! 이 답변에는 많은 투표권이 있으므로 영리한 것이 있어야합니다. 그러나 나는 그것을 완전히 보지 못한다.
Konrad Rudolph

1
@fennec 글 머리 기호는 사람들을 죽이지 않으며 사람들은 사람들을 죽입니다. 기계가 마침내 지각되지 않는 한, 나는 벙커에있을 것입니다.
antony.trupe

5
총은 사람을 죽이지 않고 랩퍼를 죽입니다.
Jon Hopkins

36

프로그래밍에서 정말 악한 것이 있습니까?

물론. 당신의 두뇌를 사용하지 않고 당신이하고있는 일과 왜 그것을하고 있는지에 대한 생각은 모든 프로그래밍 악의 근원입니다 .


2
+1. 그러나 그 의미에 대해 생각하고 이해하면 더 좋습니다.
Richard

아인슈타인에 따르면 인간의 어리 석음은 유한하지 않습니다.
Nils

25

빈 일반 예외 처리기 :

catch(Exception ex)
{
}

누군가가 나에게 유효한 유스 케이스를 줄 수 있다는 것은 의심의 여지가 없지만 솔직히 말하면 진지하게 독창적이며 최소한 설명이 필요합니다.


1
+1 다른 사람이 없었다면 이것을 추가하려고했습니다
Conrad Frix

1
정말? "실패해도 상관 없습니다"는 어떤 상황에서도 유효하지 않습니다. 모든 소규모 유틸리티에서 성공 또는 실패를 보장 할 필요는 없습니다. 먼저 생각하지 않는 또 다른 경우는 진정한 악입니다.
SilverbackNet

4
레거시 코드 All에서 알 수 있습니다. 그만큼. 시각. 더 나쁜 것은 내가 바꿀 때 사람들이 나에게 질문한다는 것입니다.
George Stocker

5
먼저 "빈 캐치 블록 적중"유형 예외를 전송하는 전자 메일 알림을 추가하고이를 캐치하여 해제하면 캐치가 실제로 존재하는 이유와 현재 상태를 확인할 수 있습니다. 그런 다음 수정합니다.
CaffGeek

2
Java에서 확인 된 예외에 투표합니다 .D
Nils

19

아마도 질문을 뒤집어 놓고 프로그래밍에 절대 적이고 완벽하게 좋은 것이 있는지 물어볼 수 있습니까? 당신이 한 가지를 생각할 수 없다면 (나는 할 수 없다는 것을 안다), 악의 개념은 또한 진흙 투성이입니다.

실수, 오해 및 기타 일반적인 혼란을 초래하는 일반적인 행동이 있지만 언어 기능 X가 본질적으로 악하다고 말하는 것은 기능 X의 목적을 실제로 이해하지 못한다는 것을 인정하는 것입니다.

많은 상심을 구하고 오해를 피할 수있는 일반적인 행동이 있지만, 언어 기능 Y가 본질적으로 좋다고 말하는 것은 기능 Y 사용의 모든 의미를 완전히 이해하지 못한다는 것을 인정하는 것입니다.

우리는 유한 한 이해와 강한 의견, 위험한 조합의 사람들입니다. 하이퍼 볼은 우리의 의견을 표현하고 사실이 허구가 될 때까지 사실을 평가하는 방법입니다.

그럼에도 불구하고, 문제를 일으키는 행동을 피하고이를 피하는 행동을 추구 할 수 있다면 조금 더 생산적 일 수 있습니다. 하루가 끝나면 그게 전부입니다.


3
프로그래밍에서 절대적이고 완벽하게 좋은 것이 있습니까? 명확하고 잘 작성된 문서?
James

4
@James 명확하고 잘 작성된 문서는 종종 읽을 수없는 코드를 변명하는 데 사용되며, 코드가 너무 오래 지속되면 코드와 함께 유지해야하는 족쇄가 될 수 있습니다. 명확하고 잘 작성되었지만 완전히 오래된 문서도 순수한 악이 될 수 있습니다.
유진 요코타

작업 코드 !!!
Scott Whitlock

이유를 설명하는 주석. 좋습니다.
Tim Williscroft

동일한 코드가 좋은지 나쁜지 몇 명의 다른 개발자에게 물어 보면 다른 답변을 얻을 수 있습니다. 그것이 절대적으로 좋다고 말하면 다소 부정확합니다.
Berin Loritsch

13

떠오르는 유일한 것은 이것입니다 :

#DEFINE TRUE FALSE
#DEFINE FALSE TRUE

그러나 다시 한 번, 그것은 단지 오래된 낡은 오용입니다.


3
이 매크로가 FALSE와 TRUE를 모두 TRUE로 설정합니까?
표시 이름

2
@bold : 실제로 몇 년 전에 그 문제에 부딪 쳤습니다. 일부 잘못된 매크로 정의로 인해 TRUE와 FALSE 모두 동일한 값 (0, IIRC)으로 평가되었습니다. 재미있는 오후를 위해 만들어 졌다.
John Bode

1
@bold 아니면 다른 방법입니까?
Mateen Ulhaq

11

필자는 영구적으로 시스템 트레이에 앉아있는 스키닝, 자동 업데이트 프로그램, 파일 연결 및 기타 시스템 설정을 가로채는 응용 프로그램은 완전히 악의적이라고 생각합니다.

플래시 전용 웹 사이트와 함께.


10
당신은 어도비가 악하다고 말하고 있습니까?
David Murdoch

10
@David : 무엇을 아직 몰랐습니까?
메이슨 휠러

8
파일 연결 하이재킹의 가장 큰 원인은 QuickTime입니다.
Orbling

잠시 동안 RealPlayer에 대해 이야기하고 있다고 생각했습니다. (VLC의 자랑스러운 새로운 사용자!)
Mateen Ulhaq

2
나는 어도비와 애플이하는 모든 일이 악하다는 결론에 도달하고있다.
Brian Knoblauch

10

우연히 작동하는 모든 것은 본질적으로 악합니다.

기본 컴파일러 옵션을 사용하여 실제로 내 컴퓨터에서 작동하는 다음 C 프로그램을 고려하십시오.

#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);   
   }
}

이 프로그램이 루프 카운터를 증가시키는 방식을 변명 할 수있는 것은 아무것도 없습니다. 그것은 내 컴퓨터, 컴파일러, 기본 옵션에서 올바른 일을하는 정의되지 않은 효과 일뿐입니다.


좋은. 좋은 예-알아 내기 위해 초가 걸렸습니다! 시원한.
Michael K

5
나는 이것이 본질적으로 악한 것 보다 본질적으로 잘못 이라고 생각합니다 .
Lawrence Dol

형식 문자열의 오타 수정
user281377

3
멜은 자랑스러워 할 것입니다.
Barry Brown

필자는 구조체가 어셈블러 호출에서 데이터 구조를 오버레이하는 데 사용되는 것과 거의 같은 방식으로 멋지다고 생각합니다. 분명히 여기서 의도하지 않은 것이지만 예제를 위해 의도했습니다. 제대로 사용하려면 전원이 더 많이 들립니다. NB. 훌륭한 인터뷰 질문이 될 것입니다.
Orc

10
그렇다면 절대 악은 모든 모범 사례와 완전히 호환되지 않는 것이 프로그래밍에 존재합니까? 그리고 그렇다면 무엇입니까?

예; 표준 C 라이브러리 함수 gets(). C 표준위원회가 공식적으로 폐기 한 것은 악한 일이며, 다음 버전의 표준에서 나올 것으로 예상됩니다. - 그 하나의 라이브러리 호출로 인한 신체 상해는 레거시 코드의 30 년 이상 '의 가치를 파괴의 전망보다 더 무서운이다 입니다 그것이 얼마나 악한.


C 관리에 대해 말하지 않는 사람들에게 왜 그렇게 악한 일인지 자세히 설명하겠습니까?
Jon Hopkins

8
gets()버퍼의 주소 인 단일 인수를 사용합니다. 줄 바꿈이 표시 될 때까지 표준 입력에서 버퍼로 문자를 읽습니다. 그것이받는 모든 것이 버퍼의 주소이기 때문에 gets()버퍼가 얼마나 큰지 전혀 모른다. 버퍼의 크기가 10 자이고 입력 스트림에 100이 포함 된 경우 추가 90자가 버퍼 바로 다음에 메모리에 기록되어 스택을 방해 할 수 있습니다. 결과적으로 선호되는 맬웨어 공격입니다. 설계 상 안전하지 않으며 안전하지 않습니다 .
John Bode


7

그렇다면 절대 악은 모든 모범 사례와 완전히 호환되지 않는 것이 프로그래밍에 존재합니까?

당연히 아니지. 내 툴박스에 악의적 인 것이 있는지 묻는 것과 같습니다. 내 4 살짜리 아이가 손을 잡지 않으면 내 망치는 나에게 큰 "좋은"것입니다.


나는 그의 능력을 충분히 사용하는 노인이 그것을 사용하여 좋은 것을 손상시킬 때 더 나쁘다고 생각합니다.
guiman

6

오늘의 악은 어제 완벽했습니다. 진화입니다.


1
GOTO는 이것의 반례이며, 마법의 숫자입니다.
James

6

너무 진지하지는 않지만 ...

우리는 "악"에 대한 매우 근시적인 견해를 가지고 있습니다. 다른 사람들을 많이 죽이는 사람들은 사악합니다. 다른 사람을 훔치는 사람들은 악합니다. 내가 아는 모든 나라는 과거에 약간의 악을 가지고 있습니다. 일부는 그것을 거부하고 싶습니다.

프로그래밍에 악이 있습니까? 우리의 무고한 프로그래머는 "실제로"생각하지 않을 수 있습니다. 그러나 일단이 주제에 대해 널리 사용되는 계층 데이터베이스의 발명자와 대화를 나눈 적이 있습니다. 누가 최고의 고객인지 알고 싶습니까? 공산주의 폴란드의 비밀 경찰.

지금 세상에 악이 있습니까? 물론이지. 그리고 그들은 프로그래머를 사용하고 있습니까? 물론이지.


2
아마도 내가 생각했던 것보다 더 악한 변형이있을 것입니다. 비밀 경찰과 비교하면 우리는 정말 나쁜 이야기입니다.
Jon Hopkins

@Jon : ... 그리고 이번 시즌에 모든 사람들은 "naughty"와 "nice"가 함께한다는 것을 알고 있습니다 :)
Mike Dunlavey

대량 학살은 항상 정말 악합니다. 절도에 대해 다르게 느낍니다. 도둑질은 다른 사람에게 상처를 주지만 의도는 아니지만 다른 사람의 결과를 개선하는 것입니다. 도둑이 도둑질하는 사람을 해치지 않고 결과를 쉽게 향상시킬 수 있다면. 나는이 부도덕하지만 실제로 악하지는 않다고 생각합니다.
JD Isaacks

@ 존 : 로빈 후드? 무슨 뜻인지 알아 사실 파레토 효율 은 그 모든 것입니다. 오늘날 인기있는 이론과 반대입니다. 세상에, 이것이 화염 전쟁을 시작하지 않기를 바랍니다 ...
Mike Dunlavey

@John Isaacks-당신은 1 시간에 6,000 달러를 벌고있는 도둑이 2 개월 동안 6,000 달러를 벌기 위해 일하는 평범한 프로그래머로부터 자동차를 훔쳐서 "불균형을 바로 잡는 것"이라고 말하고 있습니다! 아니면 문제의 도둑 같은 사람들이 단순히 자신이 다른 사람들보다 낫다고 생각하기 때문에 열심히 일할 필요가 없습니까?
Jas

6

널은 악의 뿌리입니다!

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

십억 달러의 실수 :나는 그것을 10 억 달러의 실수라고 부릅니다. 그것은 1965 년에 null 참조의 발명이었다. 당시 나는 객체 지향 언어 (ALGOL W)로 참조 할 수있는 최초의 포괄적 인 타입 시스템을 설계하고 있었다. 필자의 목표는 컴파일러가 자동으로 검사를 수행하여 모든 참조 사용이 절대적으로 안전하도록하는 것이 었습니다. 그러나 구현하기가 쉽기 때문에 null 참조를 넣는 유혹에 저항 할 수 없었습니다. 이로 인해 수많은 오류, 취약성 및 시스템 충돌이 발생하여 지난 40 년간 수십억 달러의 고통과 피해를 초래했을 수 있습니다. 최근에는 Microsoft의 PREfix 및 PREfast와 같은 여러 프로그램 분석기가 참조를 확인하는 데 사용되었으며 null이 아닐 수있는 위험이있는 경우 경고를 표시합니다. Spec #과 같은 최신 프로그래밍 언어는 널이 아닌 참조에 대한 선언을 도입했습니다. 이것이 1965 년에 거부 한 해결책입니다. CAR Hoare, 2009


아미르, 분명히 많은 사람들이 이것을 얻지 못합니다 (질문 아래 HLGEM의 의견과 귀하가받은 투표 수가 적음으로 나타남). 우리의 생각에는 널 입력이 가능한 참조가 너무 깊이 포함되어 있기 때문에 실제로 자연스럽지 않다는 것을 깨닫기가 어려울 수 있습니다. 따라서 대안이 어떻게 작동하는지 설명하거나 적어도 기사와 연결되어야합니다. – 사람들이 귀하의 답변을 이해했다면, 귀하가 작성한 점수가 100 % 유효하기 때문에, 여기에서 가장 높은 순위에 속할 것입니다.
Konrad Rudolph

@Konrad Rudolph 제가 보낸 "Null References, The Billion Dollar Mistake"아래에 이에 대한 답변이 있습니다. Null에 대한 지원이 제거 된 언어가 있습니다.
Amir Rezaei

+1 슬픈 사실은 대부분의 프로그래머가 대안에 대해 전혀 모른다는 것입니다. 나는 null 참조 의 존재 에 반대하지 않고 그것이 무언가를 의미 한다는 개념에 불과합니다 . 유효하지 않은 메모리 위치를 가리키는 포인터 일뿐입니다. 대부분의 프로그래머는 도메인에서 의미가있는 것으로 간주합니다 (예 : 중간 이름 필드는 필요하지 않으므로 null 일 수 있음). 내 프로그램에서 null 은 언어 사양에 지정된 것 외에 추가 의미가 없습니다. 나에게 null 참조는 항상 오류입니다. 필드가 선택적인 경우 적절한 옵션 유형을 사용합니다.
MattDavey

@ AmirRezaei : 그들이 지적하기에 유용한 것이 있기 전에 존재하는 참조로 무엇을해야합니까? 나는 그러한 참조가 법적으로 역 참조 될 수 있지만 유용하지 않을 수있는 객체를 요구하는 것보다 분명히 역 참조 될 수없는 것을 가리키는 것이 더 낫다고 제안한다. 어떤 경우에는 참조가 초기화되기를 요구하는 방식으로 참조를 선언하는 것이 유용하지만, 항상 그런 경우 닭과 계란 문제가 발생할 수 있습니다.
supercat


5

나는 개인적으로 도널드 크 누스 (Donald Knuth)의 문구를 발견했다. 경험이 풍부한 관점에서 (이것은 내가 실패했다고 말한다).

실제로, 문구는 다음과 같이 말합니다. 문제에 깊이 들어가기 전에 특정 환경, 특정 PC 또는 사용자 집합의 문제를 이해하려고 시도하지 마십시오.


4

아무도 Globals를 진정한 악으로 띄우지 않은 것에 놀랐습니다. 매개 변수에 대해 전혀 모르고 매개 변수에 대해 실제로 제어 할 수없는 환경에서 프로그래밍하는 더 좋은 방법은 없습니다. 혼돈! 모든 코딩에서 전역 변수 사용을 엄격히 금지합니다.


+1000 가능하면 더 높게 투표하겠습니다. 오늘날 프로그래밍에서 가장 큰 문제는 하나입니다. 그리고 수많은 기사, 대화 및 노력은 사람들에게 문제에 대해 교육하는 데 사용되며 나는 그것이 결코 변하지 않는다고 생각합니다. 모든 사람이 초보자로 사용하기 시작하고 거의 문제가되지 않습니다. 전문적인 환경에서 내가 접하는 거의 모든 프로젝트는 과도하게 사용 된 전역 (주로 봄 기반 프로젝트 제외)으로 고통 받고 있습니다. Spring 프로젝트에서 BlahBlahManager.getInstance ()를 찾을 때 그것을 좋아해야합니다. 책을 샀지 만 아직 얻지 못했습니다.
chubbsondubs

6
전역이없는 사소한 응용 프로그램을 찾으십시오. 오, 그들은 랩핑되고 깔끔하고 보호되고 클래스와 프레임 워크에서 일반적으로 더 낫습니다 ...하지만 응용 프로그램에 대한 하나만 있으면 거의 전역 적입니다. 문제는 부적절한 범위의 변수를 사용하는 것입니다.
Murph

2
글로벌 변수는 그렇게 나쁜 평판을받을 자격이 없습니다. @Murph가 말했듯이 일부는 전 세계적 입니다. 파일 시스템은 전역 적입니다 (모든 프로세스가 동일하게 사용). 프로세스는 모든 스레드에 대해 전역 적입니다. 메모리는 전역 적이다 (다른 프로세스가 메모리를 사용하고 메모리 낙하산을 안전하게 사용하는 동안 충돌 할 수있다). 사용자 자신이 전역는 (UI 디자인의 관점에서 생각). 글로벌 변수, 또는 싱글 톤, 서비스 로케이터 또는 레지스트리와 같은 글로벌 변수를 모델링하는 것은 잘못된 일이 아닙니다.
kizzx2

3

도구는 본질적으로 악하지 않습니다. 그것의 존재는 하나의 유스 케이스를 제외하고는 모두 어리석은 것일 수 있지만 그것이 악을 일으키지는 않습니다. 프로그래머에게 적절한 사용을 결정해야 할 책임이 있습니다.



3

나는 내가 게시물을 만들지 않겠다고 말했지만 한 가지 답을 쓸 것이다. 다른 사람들이 아무 악도 없다고 말한 것처럼 나는 절대 악이 있다고 말할 것이다

Setjmp / LongJmp 는 순수한 악입니다.


1
+1 Setjmp / LongJmp의 적절한 사용 사례를 아직 보지 못했습니다.
Oliver Weiler

@Helper Method : 하하, 감사합니다. 누군가 나에게 동의하게되어 기쁘다

4
try / finally / catch + throw는 Setjmp + LongJmp를 통해 구현됩니다.
comonad

3
SetJmp + LongJmp를 사용하면 PTC (적절한 테일 호출)가없는 언어 / 컴파일러를 사용하여 테일 호출을 통해 CPS (Continuation Passing Style)를 실현할 수 있습니다. trampolining의 최적화 된 버전입니다. en.wikipedia.org/wiki/Tail_call#Through_trampoliningen.wikipedia.org/wiki/Continuation#Kinds_of_continuations
comonad December

1
setjmp / longjmp보다 더 나쁜 것은 setjmp / longjmp를 사용하여 가난한 사람의 초경량 스레딩 라이브러리를 구현하는 것입니다. 유쾌하게 사악한 코드! :-)
Brian Knoblauch



2

어떤 도구는 선과 악에 사용될 수 있지만 , 일부 도구 자주 사용하지 않는 프로그래머를 놀라게하기 때문에 악합니다.

32 비트보다 짧은 정수로 작업 할 때 Java 악의 부호없는 오른쪽 시프트 연산자 (>>>) (놀랍게도 부적절한)를 고려합니다.

값이 -1 인 바이트 b가 있다고 가정하십시오.

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

부호없는 오른쪽 시프트 연산자는 0을 가장 왼쪽 비트로 이동합니다. 따라서 1을 얻기 위해 7만큼 이동한다고 가정합니다.

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

그러나 대신이 작업은 전혀 수행하지 않습니다. b는 여전히 -1입니다.

다음 25 가지 교대조 모두 아무 것도 수행하지 않습니다.

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

이것은 b>>>=7대략적으로

                                  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

교체해야 할 것입니다

b >>>= i;

으로, ~에 의하여

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

'예상대로'작동하도록합니다.


1
나는 자바를 모르지만 왜 이것이 악한가? int에서만 사용해야하고 byte는 int가 아니라고 말하고 있습니까? >>> a이지만 이상한 것으로 보입니다 .D를 부호없는 시프트로 알고 있기 때문에 -1이 발생하지 않아야합니다.

@ acidzombie24 절대적으로 맞습니다. >>>는 부호없는 시프트이고 >>는 부호있는 시프트입니다. 그러나 바이트를 이동할 때 먼저 int (부호로 채워진)로 확장 된 다음 이동합니다. 따라서 '서명되지 않은'교대조차도 부호로 확장합니다. 실제로 결과는 양수이지만 바이트에 저장하면 다시 음수입니다.
Robert

우와, 그건 일종의 악입니다. 또는 적어도 의도하지 않은 결과를 줄 가능성이 큽니다. 바이트에 시프트를 적용 할 수 없다고 생각하고 있습니까? int와 back으로 변환하지 않으면 좋지 않습니다.

@ acidzombie24 바이트를 사용하여 작업을 수행하기위한 머신 코드는 없습니다 (로드 / 저장 제외). JVM 레벨에서 32 비트는 가장 작은 단위입니다. 따라서 모든 작업은 컴파일러 또는 프로그래머가 수행해야합니다. 컴파일러는 변경되지 않습니다. 게시물에 필요한 조정을 추가했습니다.
Robert

2

나는 이것을 돌아 서서 절대 악이 없지만, 두개골 크기한정된 우리의 연약한 사람들 이 다른 사람들보다 실수를 저지르는 것을 더 그럴듯하게 만드는 도구와 구조물이 있다고 말할 것입니다.

그래서 사람들이 실수를 저지르는 확률에 따라 구조물 의 에 대해 이야기 할 수 있다고 말하고 싶습니다 . 물론 칼이나 칼날로 그립을 사용하여 전기 톱으로 빵을자를 수는 있지만, 충분히주의해서 잡아 당길 수는 있지만 다른 것보다 손상을 입을 가능성이 더 큽니다.


2

영어가 아닌 모국어로 코딩하고 모국어로 문서를 작성하십시오. 그런 다음 프로젝트를 인도 회사에 아웃소싱하십시오.

그것은 당신에게 악하다!

추신 : 기록을 위해, 그것은 일어나고, 인디언은 그다지 웃기지 않았다.


1
어쩌면 그들은 프로젝트를 시작하기 전에 이해했던 방식으로 사업을 수행했을 것입니다.
Merlyn Morgan-Graham

그들은 어떻게 그것을 기대할 것입니까? 영어 이외의 코드 / 문서를 글로벌 의미로 사용하는 것이 좋다고 생각하십니까?
k25

1

나는 계속해서 말하기를 원하지만 정답은 프로그래밍에 객관적이고 절대적인 악이 없다는 것입니다. 반면에 최고의 도구조차도 남용 될 수 있습니다.


연속성이 훨씬 적다는 것을 이해 한 사람은 많지 않습니다. 그들이 어떤 상황에 처하게 되었습니까? 연속성이 실제로 게임을 변화시키는 한 가지 사례는 비동기 프로그래밍, 특히 UI 프로그래밍에서 UI가 멈추지 않도록 이벤트를 계속 펌핑해야하는 경우입니다. 재사용은 동기식 스타일 개발에서 실제로 잘 작동하기 때문에 비동기 프로그래밍은 모든 종류의 두통을 유발합니다. 연속 스타일을 사용하여 동기식 스타일을 복원 할 수 있지만 UI가 정지되지 않도록 할 수 있습니다. 꽤 굉장합니다.
chubbsondubs

1
나는 연속이 악하다고 생각하지 않지만, 그것을 사용하여 작성된 코드가 자동으로 "영리한"것이라면 커뮤니티에서 많은 것을 생각합니다.
Larry Coleman

1

프로그래밍 그 자체는 본질적으로 악한 것이 아니라고 생각합니다. 그러나 프로그래밍은 종종 사회 활동이며, 주변 사람들을 무시하는 것은 매우 악할 수 있습니다. 사람들은 대부분의 코드가 다른 사람들과 공유 될 것이라는 사실을 종종 잊습니다. 대부분 읽기도하고 때로는 쓰기도합니다. 오픈 소스, 회사가 출시하는 제품 또는 컨설턴트를위한 작은 패치 작업을 위해 프로그램을 읽을 수 있습니다.

그것이 많은 "유해한 것으로 간주되는"기사가 존재하거나 사람들이 "never"라고 말하는 이유의 절반입니다. 다른 사람을 위해 인생을 어렵게 만드는 것은 모든 악의 근원입니다. 그렇지 않습니까?


1

그렇습니다. 많은 악이 있습니다. 예를 들면 다음과 같습니다.

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

1

불충분 한 이익을 위해 시스템의 총 비용을 늘리십시오. 너무 많은 복사 및 붙여 넣기, 너무 복잡한 아키텍처 또는 값 비싸지 만 비효율적 인 상업용 제품을 사용할 수 있습니다. 일반적으로 모든 소프트웨어 기술은 시스템의 총 비용을 줄이는 데 목적이 있으며, 너무 비싼 시스템으로 끝내면 잘못되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.