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

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
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

Всё это очень путает, как правильно сделать? жалко что нет вики - как работать с общим кодом, надеюсь на форумчан.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
пробовал по-разному, но возникают ошибки, как надо вписывать код, создавать свои классы, а потом в кубике экземпляры объектов и вызывать методы?
 

alexpost

Client
Регистрация
15.06.2016
Сообщения
173
Благодарностей
60
Баллы
28
Подпишусь под всем выше написанным. Вставлял кусок из вики без "namespace Sample{}" в общий код. Затем в кубике писал
Код:
Example a = new Example();

return a.Execute();
Возвращается значение -1.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
вот справка - http://zennolab.com/wiki/ru:projectmaker:using

но в ней нет ни одного рабочего примера, так же написано, что все классы должны быть public , а в примере работы с табом (выше самый первый кусок кода) модификатор доступа internal , как понимать такую справку?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
как я понял - public class CommonCode - это просто для примера записи, но почему тогда не отрабатывает пример из вики, даже когда ставлю тип класса public , а не internal как написано в примере вики
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
прикрепил шаблон, в котором возникают ошибки, хотя всё вроде как по правилам, хз
 

Вложения

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
прикрепил шаблон, в котором возникают ошибки, хотя всё вроде как по правилам, хз
Так вы пробуете через 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);
 
Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
куда вставлять пример из вики?
Ты не поверишь, практически куда хочешь.))

Самый удобный, это вставить класс 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, чтобы не писать его.


Тогда можно написать 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

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

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
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

Всё это очень путает, как правильно сделать? жалко что нет вики - как работать с общим кодом, надеюсь на форумчан.
Есть несколько базовых принципов работы с кодом:
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.
Все остальное уже объяснили выше.
 

deopl

Client
Регистрация
06.12.2011
Сообщения
667
Благодарностей
126
Баллы
43
Може,т ребята, направитке свои мысли на 6 конкурс статей?
 

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