Работа с общим кодом, на примерах из вики, как правильно?

  • Автор темы Автор темы arhip1985
  • Дата начала Дата начала

arhip1985

Client
Регистрация
31.10.2011
Сообщения
3 101
Реакции
802
Баллы
113
в вики есть пример:
Код:
Развернуть Свернуть Копировать
namespace Sample
{
    internal class Example
    {
        public static int Execute()
        {
            // create a new Instance object
            Instance instance = new Instance("127.0.0.1", 40500, "server");
           
            // clear cookie
            instance.ClearCookie();
           
            // clear cache
            instance.ClearCache();
           
            // go to zennolab.com
            Tab tab = instance.MainTab;
            if (tab.IsNull) return -1;
            if (tab.IsVoid) return -1;
            tab.Navigate("zennolab.com");
            if (tab.IsBusy) tab.WaitDownloading();
           
            return 0;
        }
    }
}

когда добавляю общий код в зенно, то там сразу же записано:
Код:
Развернуть Свернуть Копировать
namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }
   
}

куда вставлять пример из вики? просто ниже под общим кодом? или внутри namespace ZennoLab.OwnCode надо класс создавать? что значит класс - public class CommonCode , и нём есть закоментированная строчка - Insert your code here

Всё это очень путает, как правильно сделать? жалко что нет вики - как работать с общим кодом, надеюсь на форумчан.
 
пробовал по-разному, но возникают ошибки, как надо вписывать код, создавать свои классы, а потом в кубике экземпляры объектов и вызывать методы?
 
Подпишусь под всем выше написанным. Вставлял кусок из вики без "namespace Sample{}" в общий код. Затем в кубике писал
Код:
Развернуть Свернуть Копировать
Example a = new Example();

return a.Execute();

Возвращается значение -1.
 
вот справка - http://zennolab.com/wiki/ru:projectmaker:using

но в ней нет ни одного рабочего примера, так же написано, что все классы должны быть public , а в примере работы с табом (выше самый первый кусок кода) модификатор доступа internal , как понимать такую справку?
 
как я понял - public class CommonCode - это просто для примера записи, но почему тогда не отрабатывает пример из вики, даже когда ставлю тип класса public , а не internal как написано в примере вики
 
прикрепил шаблон, в котором возникают ошибки, хотя всё вроде как по правилам, хз
 

Вложения

прикрепил шаблон, в котором возникают ошибки, хотя всё вроде как по правилам, хз
Так вы пробуете через new создать экземпляр класса содержащий только статический метод, объект класса конечно создастся, но статический метод надо вызывать без создания класса.
И жестко подключаться к инстансу очень плохое решение, т.к. в зеннопостере у инстансов порт постоянно меняется.

Лучше передавать инстанс и project переменными при создании класса, или при вызове метода.

Пример с созданием экземпляра класса:
C#:
Развернуть Свернуть Копировать
public class MoveViz
    {
        private IZennoPosterProjectModel project;
        private Instance instance;
        public int Execute()
        {
            // clear cookie
            instance.ClearCookie();
         
            // clear cache
            instance.ClearCache();
         
            // go to zennolab.com
            Tab tab = instance.MainTab;
            if (tab.IsNull) return -1;
            if (tab.IsVoid) return -1;
            tab.Navigate("zennolab.com");
            if (tab.IsBusy) tab.WaitDownloading();
         
            return 0;
        }
     
        public MoveViz(IZennoPosterProjectModel project, Instance instance)
        {
            this.project = project;
            this.instance = instance;
        }
    }

Кубик вызова:
C#:
Развернуть Свернуть Копировать
MoveViz a = new MoveViz(project,instance);
a.Execute();

Пример со статикой:
C#:
Развернуть Свернуть Копировать
public class MoveViz
    {
         public static int Execute(IZennoPosterProjectModel project, Instance instance)
        {
            // clear cookie
            instance.ClearCookie();
         
            // clear cache
            instance.ClearCache();
         
            // go to zennolab.com
            Tab tab = instance.MainTab;
            if (tab.IsNull) return -1;
            if (tab.IsVoid) return -1;
            tab.Navigate("zennolab.com");
            if (tab.IsBusy) tab.WaitDownloading();
         
            return 0;
        }
    }

Кубик:
C#:
Развернуть Свернуть Копировать
return MoveViz.Execute(project,instance);
 
Последнее редактирование:
куда вставлять пример из вики?
Ты не поверишь, практически куда хочешь.))

Самый удобный, это вставить класс Example в пространство имен ZennoLab.OwnCode.
Код:
Развернуть Свернуть Копировать
namespace ZennoLab.OwnCode
{
   /// <summary>
   /// A simple class of the common code
   /// </summary>
   public class CommonCode
   {
     /// <summary>
     /// Lock this object to mark part of code for single thread execution
     /// </summary>
     public static object SyncObject = new object();

     // Insert your code here
   }

   internal class Example
   {
     public static int Execute()
     {
       //...
     }
   }
}
Тогда чтобы вызвать метод Execute, в кубике сишарпа пишешь Example.Execute();
Полный путь ZennoLab.OwnCode.Example.Execute();

Или так, т.е. создаешь вложенный namespace.
C#:
Развернуть Свернуть Копировать
namespace ZennoLab.OwnCode
{
   /// <summary>
   /// A simple class of the common code
   /// </summary>
   public class CommonCode
   {
     /// <summary>
     /// Lock this object to mark part of code for single thread execution
     /// </summary>
     public static object SyncObject = new object();

     // Insert your code here
   }

   namespace Sample
   {
     internal class Example
     {
       public static int Execute()
       {
         //...
       }
     }
   }
}
Тогда чтобы вызвать метод Execute, в кубике сишарпа пишешь Sample.Example.Execute();
Полный путь ZennoLab.OwnCode.Sample.Example.Execute();

Но так обычно не делается. Точнее делается, но это разносится по разным файлам. В зенке этого не сделать. Т.е. Sample будет вложенным пространством имен для ZennoLab.OwnCode и в отдельном файле это будет выглядеть так.
C#:
Развернуть Свернуть Копировать
namespace ZennoLab.OwnCode.Sample
{
   internal class Example
   {
     public static int Execute()
     {
       //...
     }
   }
}

Зачем такие "вложенности", напишу ниже.

Ну и последний вариант. Два отдельных namespace.
C#:
Развернуть Свернуть Копировать
namespace ZennoLab.OwnCode
{
   /// <summary>
   /// A simple class of the common code
   /// </summary>
   public class CommonCode
   {
     /// <summary>
     /// Lock this object to mark part of code for single thread execution
     /// </summary>
     public static object SyncObject = new object();

     // Insert your code here
   }
}

namespace Sample
{
   internal class Example
   {
     public static int Execute()
     {
       //...
     }
   }
}
Тогда чтобы вызвать метод Execute, в кубике сишарпа пишешь Sample.Example.Execute();
Полный путь Sample.Example.Execute();

Почему во втором и третьем одинаково - Sample.Example.Execute(); ?
Потому что во втором варианте зенка подхватывает ZennoLab.OwnCode и эту часть можно не писать.

В третьем же, над писать полный путь, или добавлять в using свой namespace, чтобы не писать его.
db77530993d04cd5bbf2843bdf58e84f.png


Тогда можно написать Example.Execute();

что значит класс - public class CommonCode , и нём есть закоментированная строчка - Insert your code here
Это "болванка" класса с одним статическим методом, вместо "Insert your code here" пишется свой код.
Класс CommonCode можно удалить, и написать свой.

так же написано, что все классы должны быть public , а в примере работы с табом (выше самый первый кусок кода) модификатор доступа internal , как понимать такую справку?
Ну вот и добрались до модификаторов доступа.:D
А также напишу зачем нужна вложенность namespace.

Аналогию буду проводить на пример компа, так думаю будет понятней.
Представим что есть комп, и в нем есть несколько винтов.
Комп - это программа, например зенка.
Винты - это сборки(dll), которые можно подключать/отключать.
На винте есть инфа, она расположена в различных папках и файлах.
Также и в сборке, namespace это "папки" в которых находятся классы.

Вложенность namespace делается для удобства, чтобы был порядок, а не все в кучу. Чтобы классы были тематически разбиты по разным namepsace.
C пониманием этого думаю проблем не должно быть.

Теперь по модификаторам доступа. Возьму только три public, private и internal, про остальное можно почитать тут.
https://msdn.microsoft.com/ru-ru/library/ms173121.aspx
Остальные не беру а также не буду приводить различные комбинации, чтобы не забивать голову, чтобы было понятно.:D

Классы надо добавлять в namespace, модификатор доступа у таких классов не может быть private, он может быть или public или internal(что и есть по умолчание, если у класса не прописывать модификатор доступа).
Отличие public от internal в том, что если класс public, то он будет виден из другой сборки или основной программе.
Если по аналогии с компом, если файл public, то ее видно с другого винта или с компа, аналогия конечно кривоватая, но думаю понятно.

Если internal, то данным классом можно пользоваться только внутри сборки, т.е. допустим внутри сборки есть класс, который юзает какой то другой internal класс.
Основной программе или из другой сборки данный класс виден не будет.

Также класс можно добавить в другой класс.
Код:
Развернуть Свернуть Копировать
class SomeClass
{
   class InternaalClass
   {
   }
}

Если у InternaalClass задать модификатор доступа private, то к нему доступа извне не будет, им можно будет пользоваться только внутри класса SomeClass.
Если же InternalClass будет паблик, то им можно будет пользоваться и внутри сборки.
А также из другой сборки или основной программы, только если у родительского класса уровень доступа не будет internal.

Поэтом возвращаясь к вопросу
но в ней нет ни одного рабочего примера, так же написано, что все классы должны быть public , а в примере работы с табом (выше самый первый кусок кода) модификатор доступа internal , как понимать такую справку?
Без разницы какой будет модификатор, или public или internal.

На первый взгляд, кажется что полный жестяк.:D
Нахера напридумывали эти namespace и модификаторы доступа.
На самом деле все просто и логично, писать и читать дольше.
Надо только понять в чем прикол и зачем это.

Модификаторы доступа нужны для того, чтобы разграничить права, чтобы было доступно только то, что можно, а не все подряд. Грубо говоря чтобы нельзя было кривыми ручкам влезть туда, куда не надо.:-)

Взять ту же зенку, есть основная прога и еще куча доп. либ.
Представим если бы не было разграничения по уровням доступа к различным классам зенки. Был бы доступ к классам, с помощью которых она работает, и которые обычному юзеру не нужны.

Тогда бы возникли очень интересные моменты, как минимум по неосторожности или намеренно можно бы было вызвать какой то метод, который бы мог повесить зенку.
А как максимум, можно бы было "порулить" зенкой, делая то на что разрабы вообще не рассчитывали.:D

Поэтому модификаторы доступа очень удобная и полезная штука, в идеале должно закрываться все, чтобы не было дырок, и разрешаться только самый необходимый минимум.
 
Последнее редактирование:
в вики есть пример:
Код:
Развернуть Свернуть Копировать
namespace Sample
{
    internal class Example
    {
        public static int Execute()
        {
            // create a new Instance object
            Instance instance = new Instance("127.0.0.1", 40500, "server");
        
            // clear cookie
            instance.ClearCookie();
        
            // clear cache
            instance.ClearCache();
        
            // go to zennolab.com
            Tab tab = instance.MainTab;
            if (tab.IsNull) return -1;
            if (tab.IsVoid) return -1;
            tab.Navigate("zennolab.com");
            if (tab.IsBusy) tab.WaitDownloading();
        
            return 0;
        }
    }
}

когда добавляю общий код в зенно, то там сразу же записано:
Код:
Развернуть Свернуть Копировать
namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }

}

куда вставлять пример из вики? просто ниже под общим кодом? или внутри namespace ZennoLab.OwnCode надо класс создавать? что значит класс - public class CommonCode , и нём есть закоментированная строчка - Insert your code here

Всё это очень путает, как правильно сделать? жалко что нет вики - как работать с общим кодом, надеюсь на форумчан.
Есть несколько базовых принципов работы с кодом:
1) Вне класса работа невозможна
2) Все классы изначально идут internal (видимые в пределах данной сборки приложения и доступ к классу невозможен из другого подключаемого модуля). Для того, чтобы можно было использовать в подключаемом модуле объекты сборки, надо объявлять их public.
3) namespace используется в-основном для 2 целей:
а) разграничение огромного объема кода, над которым работают множество разработчиков, чтобы не возникали конфликты.
б) задание пространства имен для использования одних и сборок/классов с одинаковыми именами в одной сборке.

Вставлять код можно несколькими способами (если не учитывать namespace):
1) вставлять классы рядом друг с другом
2) вставлять один класс в другой


Код:
Развернуть Свернуть Копировать
namespace ZennoLab.OwnCode
{

public sealed class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }

}

    public sealed class Example
    {
        public static int Execute()
        {
            // create a new Instance object
            Instance instance = new Instance("127.0.0.1", 40500, "server");
        
            // clear cookie
            instance.ClearCookie();
        
            // clear cache
            instance.ClearCache();
        
            // go to zennolab.com
            Tab tab = instance.MainTab;
            if (tab.IsNull) return -1;
            if (tab.IsVoid) return -1;
            tab.Navigate("zennolab.com");
            if (tab.IsBusy) tab.WaitDownloading();
        
            return 0;
        }
    }
}
Классы можно объявлять статичными, если не нужно работать с объектами этого класса. Если наследование не требуется, то сразу лучше объявить класс sealed.
Все остальное уже объяснили выше.
 
Може,т ребята, направитке свои мысли на 6 конкурс статей?
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)