문제

처음 프로그래밍을 시작했을 때 모든 것을 메인에 작성했습니다.그러나 배운 대로 나는 내 일에서 가능한 한 적은 일을 하려고 노력했다. main() 행동 양식.

그러나 다른 클래스/메소드에 프로그램을 인수할 책임을 어디에서 주기로 결정합니까? main()?어떻게 하나요?

나는 다음과 같이 여러 가지 방법을 보았습니다.

class Main
{
  public static void main(String[] args)
  {
    new Main();
  }
}

그리고 일부는 다음과 같습니다:

class Main {

   public static void main(String[] args) {

    GetOpt.parse(args);

    // Decide what to do based on the arguments passed
    Database.initialize();
    MyAwesomeLogicManager.initialize();
    // And main waits for all others to end or shutdown signal to kill all threads.
  }
}

에서 해야 할 일과 하지 말아야 할 일 main()?아니면 은탄환이 없나요?

시간 내주셔서 감사합니다!

도움이 되었습니까?

해결책

제 생각에는 상당한 프로젝트의 "메인"에는 약 3 개의 기능 호출이 포함되어야합니다.

  • 응용 프로그램에 필요한 모든 설정, 기본 설정 등을 설정하는 초기화 기능을 호출합니다.
  • 응용 프로그램의 기본 "컨트롤러"시작
  • 메인 컨트롤러가 종료되기를 기다린 다음 "메인"에서 정리해야 할 모든 것을 정리하는 종료 기능을 호출합니다 (컨트롤러는 이미 대부분의 정리를 처리했지만).

모든 상당한 응용 프로그램은 일반적으로 일부 계층 구조와 함께 기능의 덩어리로 나뉩니다. 기본 컨트롤러에는 특정 기능에 대한 여러 하위 컨트롤러가있을 수 있습니다.

이렇게하면 특정 기능을 찾는 것이 훨씬 쉬워지고 상대방의 분리가 더 좋습니다.

물론 다른 답변에서 말했듯이, 소프트웨어 개발에는 실제로 총알이 없습니다. 짧은 프로젝트를 위해서는 모든 것을 메인에 넣을 수 있습니다. 언어에 의존한다고 생각합니다. 일부 옵션은 특정 언어의 다른 옵션보다 쉽습니다.

다른 팁

주요 함수의 코드:

  • 단위 테스트를 할 수 없습니다.
  • 주입으로 종속성을 받을 수 없습니다.
  • 처음 작성한 애플리케이션과 유사한 다른 애플리케이션에서는 재사용할 수 없습니다.

따라서 main 함수의 코드는 다음과 같습니다.

  • 기능/시스템 테스트에만 만족할 정도로 단순해야 합니다.
  • 다른 모든 코드에서 사용되는 종속성에 대한 공 롤링 설정을 담당해야 합니다(즉, main은 애플리케이션을 생성하는 uber-factory처럼 작동합니다).
  • 앱이 설정된 방식과 관련된 작업만 수행해야 합니다(예:테스트 코드나 데모 버전이 정확히 동일한 방식으로 수행되어야 하는 것은 없습니다).

실제로 이것은 실제 앱에는 메인에 많은 것이 없다는 것을 의미합니다.장난감 앱과 원샷 프로그램은 기본적으로 꽤 많은 내용을 포함할 수 있습니다. 어쨌든 테스트하거나 재사용할 계획이 없기 때문입니다.

사실 위에서 제가 말한 것 중 일부는 C++에만 해당됩니다.물론 Java 기본 메서드는 테스트 코드나 변형 앱에서 호출할 수 있습니다.그러나 여전히 개체를 매개 변수로 사용하지 않고 명령줄 인수만 사용하므로 테스트 중에 격리할 수 있거나 재사용 측면에서 잘 작동할 수 있는 정도는 상당히 낮습니다.인스턴스화하고 앱의 나머지 부분을 만드는 데 사용할 수 있도록 클래스 이름을 전달할 수 있을 것 같습니다.

[편집하다:누군가 이 질문에서 "C++, Java" 태그를 제거했습니다.그래서:위에서 말한 내용은 C++ 및 Java에만 적용됩니다.다른 언어에서는 덜 특별한 방식으로 main을 처리할 수 있으며, 이 경우 특별히 처리할 특별한 이유가 없을 수도 있습니다.]

그들이 말하는 것처럼 보트를 떠 다니는 것은 무엇이든. :) 당신은 실제로이를 달성하는 데 필요한 도구를 사용하여 코드를 간단하고 읽기 쉽고 효율적으로 만드는 데 집중해야합니다. 메인에 많은 코드를 넣는 것이 보증되면 그렇게하십시오. 그 물건이 물건을 더 조직화 할 것이라고 생각한다면 그렇게하십시오.

단일 인스턴스를 만듭니다 class Main 인스턴스 메소드를 호출합니다 Main() 모든 작업이 주요 방법의 모든 것을 직접 작성하는 것만 큼 좋습니다.

나는 그것이 당신의 주요 기능에있는 것이 아니라 그렇지 않은 것이라고 말할 것입니다. 프로젝트의 복잡성에 따라 "데이터베이스 기능", "디스플레이 기능", "Vicar가있는 하이 티"등과 같은 기능 섹션으로 분류 할 수 있습니다.

코드의 가독성에 관한 것입니다. 당신의 프로그램을 본 적이없는 다른 누군가가 그것을 발견하고 처음에는 그것이 무엇을하는지에 대한 좋은 일반적인 아이디어를 얻을 수 있습니까?

그런 다음 메커니즘에 대해 조금 더 깊이 파고 들어야 할 곳을 쉽게 알 수 있습니까?

논리적 인 프로세스 블록 만 수행하는 각 기능 섹션입니까? 한 가지만 할 필요는 없지만 그렇게해서는 안됩니다. 모든 것 부엌 싱크대.

외부 소스로 관리 할 수있는 방식으로 코드를 분해하십시오.

원인은 하늘이 바로 내려 오면 누군가가 버그를 고칠 수 있다면 더 나은 것입니다 =)

귀하의 질문에 대한 직접적인 답변으로, 나는 기능 호출을 메인의 각 주요 구성 요소, 설정, 프로세스 및 마감에 넣어서 그것을 보는 사람이라면 누구나 프로그램의 작동 방식에 대한 빠른 개요를 얻을 수 있습니다. 그런 다음 필요한 경우 더 많이 드릴 수 있습니다.

"기본"방법의 내용과 형태는 매우 언어와 환경에 따라 다릅니다. Java에서는 모든 수업이 가질 수 있습니다 public static void main() 방법, 따라서 둘 이상을 갖는 것이 가능합니다.

그러나 이제 파르 나스의 모듈화 법칙을 통해 이것에 대해 생각해 봅시다. "모든 모듈은 비밀을 숨기고 그 비밀은 변할 수있는 것입니다." 처음에 불리는 모듈의 "비밀"은 운영 체제와 프로세스를 인터페이스하는 것의 세부 사항입니다. 인수를 얻고 불규칙한 종단을 처리하는 것과 같은 것입니다. 파이썬에서 이것은 다음과 같은 것으로 이어집니다.

def main(args=None):
    #argument processing
    #construct instances of your top level objects
    #do stuff

if __name__ == "__main__":
   try:
      main(Sys.Argv)
   except: # everything
      # clean up as much as you can
   else:
      # normal cleanup, no exceptions

여기서 요점은 당신이 할 수있는 환경에서 모든 것을 얻은 다음 main () 함수를 호출한다는 것입니다. 당신은 모든 예외를 포착하고 프로그램이 죽기 전에 그들과 지능적인 일을합니다.

주요 방법은 프로그램이 시작할 때의 일을 설명해야한다고 생각합니다. 따라서 Initialzing 메소드를 호출 할 수 있지만 논리를 메소드로 추출해야합니다.

당신의 예에서, 나는 main () 메소드를 만들지 않고 원래 메소드에 넣습니다.

프로그램의 디자인은 "메인"의 모양을 결정합니다.

당신의 주요 기능이 어떻게되어야하는지 말하는 "규칙"을 갖는 것은 - IMHO- 감각입니다.

누군가가 당신의 프로그램이 어떻게 작동하는지에 대한 아이디어를 얻고 싶다면, 아마도 그들이 볼 수있는 첫 번째 장소는 메인입니다 (적어도 나는 그렇습니다). 그래서 나는 가능한 한 적게 넣는 것이 좋은 생각이라고 생각하지 않습니다. 그러나 나는 당신의 프로그램의 작동 방식에 대한 새들의 시선을 얻는 데 필요한만큼 적은 것을 말하고 싶습니다.

따라서 주요 기능을 구현할 때 가장 큰 관심사는 가독성이어야한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top