Ana yöntem sadece nesne yaratımlarından ve yöntem çağrılarından oluşmalı mıdır?


12

Bir arkadaşım bana, en iyi uygulamanın sınıf içeren mainyöntemin adlandırılması Mainve yalnızca mainyöntem içermesi olduğunu söyledi . Ayrıca mainyöntem yalnızca girdileri ayrıştırmalı, diğer nesneleri oluşturmalı ve diğer yöntemleri çağırmalıdır. MainSınıf ve mainmetot başka bir şey yapmamalıyız. Temelde, sınıf içeren mainmetodun şöyle olması gerektiğini söyledi:

public class Main
{
    public static void main(String[] args)
    {
        //parse inputs
        //create other objects
        //call methods
    }
}

En iyi uygulama bu mu?


6
Başka ne olabilir bunu yapmak?
Pubby

Yanıtlar:


11

Arkadaşınızın belirttiği nokta, bir uygulamanın sadece ana yöntemle önyüklenmesi ve başka bir şey olmamasıdır. Ana yöntemi kendi sınıfında tutarak, bu gerçeği herhangi bir uygulama mantığından bağımsız tutarak güçlendiriyorsunuz. Ana yöntemin rolü herhangi bir girdiyi ayrıştırmak ve uygulamayı bu girdilerle ve muhtemelen diğer girdilerle başlatmaktır.

public static void main(String[] args){
    new Foo().start(args[0]);
}

Fikir, başlatmak için ana yönteme ihtiyacınız olmamasıdır Foo. Bu Foo, potansiyel olarak farklı semantiklerle kolayca başka bir bağlamda başlatmanıza ve başlatmanıza olanak tanır .

public Foo initSomewhereElse(String arg){
    Foo f = new Foo();
    f.start(arg);
    return f;
}

7

Main () yöntemi, prosedürel programlamaya çirkin bir geri dönüş olup uygulamaya giriş noktasını sağlar. Çeşitli programlama dillerinde onu kapsüllemek için girişimler yapılır, ancak doğası bunu zorlaştırır (halka açık ve statik olması gerekir, ancak ASLA programdaki son derece çelişkili herhangi bir şeyden çağrılmamalıdır). WPF başarılı oldu (main () WPF uygulama projesinin bağırsaklarının derinliklerinde saklanarak ve özel işleme için yapılandırılabilir "kancalar" sağlayarak) Java'da olduğu gibi (Android uygulamaları için de benzer şekilde), ancak WinForms ve diğer birçok tür uygulamalar hala main () ile ilgilenmenizi sağlar.

Bu nedenle, uzmanların çoğu main () işlevinin LOC değerinin olabildiğince düşük olması gerektiğini söylüyor. Main () işlevinin bir satırı olduğu bir yaklaşım (ki biraz abartılı olduğunu düşünüyorum) vardır:

public class Program
{
   private Program(string[] args)
   {
      //parse args and perform basic program setup
   }

   //Reduce the ugliness to the absolute minimum
   public static void main(string[] args)
   {
      new Program(args).Run();  
   }

   private void Run()
   {
      //kick off the driving O-O code for the app; i.e. Application.Run()
   }    
}

Bu biraz fazla, ama temel ilkeye katılıyorum; main (), nesne yönelimli, olay güdümlü uygulamanızı "hazır" duruma getirmek için mümkün olduğunca az olmalıdır.


Katılmıyorum. mainDiğer bağlamlardan çağrı yapmak yararlı olabilir - örneğin, özyineleme.
DeadMG

4
Şahsen ana yönteminizi tekrarlıyorsanız, bunun yerine başka bir yöntemi çağırmanız ve tekrarlamanız gerektiğini düşünüyorum. Sadece en basit bağlamlarda (kabaca ödev düzeyinde karmaşıklık / zorluk konsol uygulaması) programınızdan main () çağırmak kabul edilebilir ve ben buna önemsiz bir durum diyebilirim.
KeithS

1

Fonksiyonları destekleyen dillerde mainsadece normal bir fonksiyondur ve bu nedenle onunla söyledikleriniz dışında yapabileceğiniz başka bir şey yoktur. Ve sonra , her şeyin bir nesne olması lehine işlevleri düzelten aptal diller var, yani her işlev istediğinizde onu gereksiz bir sınıfa sarmanız gerekiyor .

Yeterince saçma sapan. Yapmaya çalıştığım nokta Maingerçekten bir sınıf değil, bir işlev ve bu nedenle girdileri ayrıştırmak, diğer nesneleri oluşturmak ve diğer yöntemleri çağırmak dışında bir şey yapmamalısınız çünkü hepsi bir işlevin yapabileceği.

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.