다른 언어에서 개념을 모방하면 어떤 문제가 발생할 수 있습니까?


12

웹에서 언어가 객체 지향 또는 함수 호출과 같은 일부 개념을 지원하지 않는 경우 웹에서 여러 번 읽었 으며이 다른 상황에서는 모범 사례로 간주됩니다.

내가 지금 볼 수있는 유일한 문제는 다른 프로그래머가 평소와 너무 다른 코드를 발견하여 프로그래밍하기가 어렵다는 것입니다. 이로 인해 다른 문제가 발생할 수 있다고 생각하십니까?


3
사람들은 당신을 즐겁게 해줄 것입니다 :-)
Karl Bielefeldt

한번 자바로 D에서 중첩 된 함수 파서를 번역했지만 나는 그것이 (그 안에 정의 된 구현하는 인터페이스와 여러 클래스와 하나 개의 큰 기능) 내가 작성한 코드의 깨끗한 부분이 아니다 인정한다
래칫 괴물

답변:


23

문제 중 하나는 다른 언어로 할 수있는 방식으로 무언가를 표현하기 위해 많은 코드를 작성하고 자신이 사용하는 언어에보다 직접적인 방법이 있다는 것입니다.

예를 들어, Stack Overflow에 대한 답변 에서 .NET Framework에서 사용되는 개념 인 코드 계약을 지원하지 않는 PHP에서 부분적으로 에뮬레이션하는 방법을 설명했습니다. 간단한 배열로도 같은 일을 할 수 있었기 때문에 많은 코드를 작성하지 않았습니다.

보다 일반적으로, 각 언어에는 고유 한 문화, 고유 한 모범 사례, 고유 한 스타일이 있습니다.

  • C와 같은 C # 코드 작성을 시작하면 추악한 것입니다.

  • Haskell을 강제로 사용하는 Java 개발자로 Haskell을 체포하지만 그 강점을 이해하고 싶지 않고 Java의 개념을 복제하려는 경우 필자가 작성하는 코드가 손상됩니다.

  • 기타

언어 를 향상 시키려는 것은 잘못된 일이 아닙니다 (예 : F #에서와 같이 측정 단위를 도입 하여 C # 향상 ). 너무 많이 수행하는 경우 실제로 필요에 맞는 다른 언어를 선택해야합니다.


+1 좋은 답변이며 F #에서와 같이 C #에 측정 단위를 추가 한 추가 검색어에 감사드립니다.

2
Java를 사용하도록 강요되어 일을 그만 둔 사람으로서, 내 2 센트 : 하나는 Haskell을 사용하도록 강요받지 못하고, 그것을 사랑에 빠뜨렸다가 다시 돌아올 수없는 지점으로 당신을 빨아들입니다. Haskell은 당신이 가고 싶어하는 사랑스러운 블랙홀과 같습니다-그리고 실제와는 달리, 당신은 여전히 ​​이야기를하기 위해 살아갑니다 :)
Cetin Sert

클라이언트 측 JavaScript와 같이 선택할 수없는 경우를 제외하고 다른 언어를 선택해야합니다 . (그렇더라도 프로토 타입 언어로 클래스 기반 OOP 에뮬레이션을 구현할 수있는 선택의 여지가 없습니다. 언어 작동 방식을 배우는 것이 훨씬 더 효율적입니다.)
kojiro

@kojiro : 또는 다른 직업. PHP를 사용해야 할 때에도 같은 문제가 발생했으며 자체 컴파일러 작성을 포함하여 언어를 계속 수정하려고했습니다. 덜 까다로운 해결책은 직업을 바꾸고 PHP를 사용하지 않는 프로젝트에서만 일을 시작하는 것이 었습니다.
Arseni Mourzenko

1
@Cetin Sert : Haskell은 훌륭한 언어입니다. 그러나 누군가 배우고 싶지 않고 함수형 프로그래밍을 이해하지 못하면 Haskell을 이해하기가 어려울 것입니다.
Arseni Mourzenko

10

가독성이 떨어지면 그 자체로는 문제가 충분합니다. 광범위한 교육을받지 않고도 프로젝트를 유지 관리 할 수있는 사람들의 수가 크게 줄어 듭니다.

게다가,

  • 외국 패러다임을 구현하면 사용으로 인한 잠재적 절약보다 더 많은 비용이들 수 있습니다
  • 외부 기능에 적응하면 버그가 생겨 유지 관리 비용이 증가 할 수 있습니다.
  • 외부 기능을 채택하면 기술 스택이 기본 구현에 필요한 한계를 넘어서게 될 수 있습니다.

2
한 번 바닐라 C에서 C ++ 동적 디스패치 (가상 테이블 등)를 에뮬레이트해야했고 정확히이 문제가 발생했습니다. 동적 디스패치를 ​​이해하지 못한 C 프로그래머는 프로젝트에 참여하거나 유지할 수 없었습니다.
오는 폭풍

4

종이에 나타나는 것만 큼 좋은 생각은 아닙니다.

예 1 : 나이가 충분하다면 C가 도시의 새로운 아이였던 시절을 기억할 것입니다. Pascal과 Ada 프로그래머는 C의 간결한 열기 및 닫기 버팀대를 좋아하지 않았습니다. 그들은 #define에 의해 정의 beginend열린 중괄호 닫는 중괄호, 짜잔로! 카드 다! 불행한 결과는 Ada 또는 C의 관점에서 추악했습니다.

예제 2, 개인 : Common Lisp Object System에서 내가 정말 좋아했던 것 중 하나는 이전, 이후 및 주변 메소드입니다. 여러 곳에서 매우 편리하게 사용할 수 있습니다. 그래서 나는 몇 가지 선택된 장소에서 C ++ 로이 개념을 모방했습니다. C ++에서 이러한 구문을 에뮬레이트하는 유일한 방법은 파생 클래스 개발자가 코드의 올바른 위치에서 같은 이름의 부모 클래스 메서드를 호출하도록하는 것입니다. 이것은 C ++ 프로그래밍에 다소 익숙하지 않은 클래스에서 파생 된 개발자 및 C ++ 프로그래밍에 대해 요구 사항을 제시했습니다. 이 요구 사항이 아무리 잘 문서화 되었더라도 사람들은 C ++ 패러다임에 맞지 않기 때문에 지침을 따르지 않았습니다.


2

다른 언어에서 개념을 모방하면 어떤 문제가 발생할 수 있습니까?

새는 추상화.


답변에 더 자세한 내용을 포함시키는 것이 좋습니다. 이 기사는 추상화가 중요한 성능 최적화를 캡처하지 못하는 경우와 관련이 있지만 일관성없는 코너 케이스 동작과 일관성없는 보증으로 인해 더 큰 문제가 발생한다고 말합니다. 후자의 예는 out실제로 매개 변수를 지원하지 않는 프레임 워크에서 매개 변수 를 에뮬레이트하려는 C #의 시도입니다 . C #에서는 모든 함수가 항상 모든 out매개 변수에 기록한다고 가정 하지만 C # 메서드가 호출하는 비 C # 메서드는 그러한 보장을 제공하지 않습니다.
supercat

1

엄청나게 어려울 수 있습니다. C #에서 Java 애플리케이션으로 LINQ를 구현하려고한다고 상상해보십시오. 아니면 어휘 폐쇄를 언어에 추가하는 것은 어떻습니까? 새로운 컴파일러를 작성해야 할 것인데, 이는 새로운 언어를 제공합니다.

또는 자신의 언어를 구현할 필요가없는 경우에는 코드 블록이나 람다 함수 또는 클로저 또는 함수가없는 언어에서 우선 순위 함수 (예 :지도)를 사용하여 컬렉션 메서드를 구현하려고한다고 상상해보십시오. 클래스 객체. 모든 고차 함수는 인터페이스로 선언되고 명시 적으로 구현되어야하며 클로저에서 캡처 된 모든 상태는 구현 클래스에 명시 적으로 저장되어야합니다. 너무 많은 타이핑과 읽기가 너무 어려워서 종종 가치가 없습니다.

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