Lecture10 (Лекции по Технологии программирования. Компонентный подход), страница 3
Описание файла
Файл "Lecture10" внутри архива находится в папке "Лекции по Технологии программирования. Компонентный подход". PDF-файл из архива "Лекции по Технологии программирования. Компонентный подход", который расположен в категории "". Всё это находится в предмете "основы программной инженерии" из 6 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 3 страницы из PDF
Правила размещения исходного кода по файлам несколько отличаются.Код пользовательских типов Java размещается вфайлах с расширением .java.При этом каждый файл относится к томупакету, чье имя указывается в самом началефайла с помощью декларации packagemypackage;При отсутствии этой декларации код такогофайла попадает в пакет с пустым именем.Код пользовательских типов C# размещается вфайлах с расширением .cs.Декларация пространства имен начинается сконструкции namespace mynamespace { изаканчивается закрывающей фигурной скобкой.Все типы, описанные в этих фигурных скобках,попадают в это пространство имен.
Типы,описанные вне декларации пространства имен,попадают в пространство имен с пустымименем.Пространства имен могут быть вложены вдругие пространства имен. При этомследующие декларации дают эквивалентныерезультаты.namespace A.B { … }namespace A{namespace B { … }}В одном файле может быть описан только одинобщедоступный (public) пользовательский типверхнего уровня (т.е.
не вложенный в описаниедругого типа), причем имя этого типа должносовпадать с именем файла без расширения.В том же файле может быть декларированосколько угодно необщедоступных типов.В одном файле можно декларировать многотипов, относящихся к разным пространствамимен, элементы одних и тех же пространствимен могут описываться в разных файлах.Пользовательский тип описывается полностьюв одном файле.Чтобы ссылаться на типы, декларированные вдругих пакетах, по их коротким именам, можновоспользоваться директивами импорта.Если в начале файла после декларации пакетаприсутствует директиваПользовательский тип описывается целиком водном файле, за исключением частичных типов(введены в C# 2.0), помеченных модификаторомpartial — их элементы можно описывать вразных файлах, и эти описания объединяются,если не противоречат друг другу.Чтобы ссылаться на типы, декларированные вдругих пространствах имен, по их короткимименам, можно воспользоваться директивамииспользования.Директиваimport java.util.ArrayList;using System.Collections;то всюду в рамках этого файла можноссылаться на тип ArrayList по его короткомуимени.Если же присутствует директиваделает возможным ссылки с помощьюкороткого имени на любой тип (или вложенноепространство имен) пространства именSystem.Collections в рамках кодапространства имен или типа, содержащего этудирективу или в рамках всего файла, еслидиректива не вложена ни в какое пространствоимен.Можно определять новые имена (синонимы илиалиасы) для декларированных извне типов ипространств имен.
Например, директиваimport java.util.*;то в данном файле можно ссылаться на любойтип пакета java.util по его короткому имени.Директиваimport static java.lang.Math.cos;(введена в Java 5) позволяет в рамках файлавызывать статический метод cos() классаjava.lang.Math просто по его имени, безуказания имени объемлющего типа.Во всех файлах по умолчанию присутствуетдирективаusing Z=System.Collections.ArrayList;позволяет затем ссылаться на типSystem.Collections.ArrayList по имени Z.import java.lang.*;Таким образом, на типы из пакета java.langможно ссылаться по их коротким именам (если,конечно, в файле не декларированы типы стакими же именами — локальнодекларированные типы всегда имеютпреимущество перед внешними).Файлы должны располагаться в файловойсистеме определенным образом.Выделяется одна или несколько корневыхдиректорий, которые при компиляцииуказываются в опции -sourcepathкомпилятора.
Файлы из пакета без именидолжны лежать в одной из корневыхдиректорий. Все остальные должны находитьсяв поддиректориях этих корневых директорийтак, чтобы имя содержащего пакета, к которомуфайл относится, совпадало бы с именемсодержащей сам файл директории относительновключающей ее корневой (с заменой точки наразделитель имен директорий).Результаты компиляции располагаются вНет никаких ограничений на именованиефайлов и содержащихся в них типов, а также нарасположение файлов в файловой системе иимена декларированных в них пространствимен.Результат компиляции C# программы —файлах с расширением .class, по одному типу нафайл. Хранящие их директории организуютсяпо тому же принципу, что и исходный код, — всоответствии с именами пакетов, начиная отнекоторого (возможно другого) наборакорневых директорий.
Указать компиляторукорневую директорию, в которую нужноскладывать результаты компиляции, можно спомощью опции -d.Чтобы эти типы были доступны прикомпиляции других, корневые директории,содержащие соответвующие им .class файлы,должны быть указаны в опции компилятора classpath.В этой же опции могут быть указаны архивныефайлы с расширением .jar, в которых много.class файлов хранится в соответствии соструктурой пакетов.Входной точкой программы является методдинамически загружаемая библиотека (срасширением .dll в системе Windows) илиисполняемый файл (.exe), имеющие особуюструктуру. Такие библиотеки называютсясборками (assembly).Для того чтобы использовать типы,находящиеся в некоторой сборке срасширением .dll, достаточно указать ее файлкомпилятору в качестве внешней библиотеки.public static void main (String[])public static void Main ()одного из классов. Его параметр представляетсобой массив строк, передаваемых какпараметры командной строки при запуске.При этом полное имя класса, чей метод main()выбирается в качестве входной точки,указывается в качестве параметра виртуальноймашине при запуске (параметры команднойстроки следуют за ним).одного из классов.
Такой метод может такжеиметь параметр типа string[](представляющий параметры команднойстроки, как и в Java) и/или возвращать значениетипа int.Класс, чей метод выбирается в качествевходной точки, указывается в качествестартового класса при сборке исполняемогофайла. Собранный таким образом файл всегдабудет запускать метод Main() указанногокласса.Входной точкой программы является методНиже приведены программы на обоих языках, вычисляющие и печатающие на экране значениефакториала неотрицательного целого числа (0! = 1, n! = 1·2·…·n), передаваемого им в качествепервого аргумента командной строки.
Также приводятся командные строки для их компиляции изапуска.В отличие от Java, параметры компилятора и способ запуска программ в C# нестандартизованы. Приведена командная строка для компилятора, входящего в состав MicrosoftVisual Studio 2005 Beta 2. Предполагается, что директории, в которых находятся компиляторы,указаны в переменной окружения $path или %PATH%, и все команды выполняются в той жедиректории, где располагаются файлы с исходным кодом.Компилятор Java и Java-машина располагаются в поддиректории bin той директории, вкоторую устанавливается набор для разработки Java Development Kit. Компилятор C#располагается в поддиректории Microsoft.NET\Framework\v<номер версии установленнойсреды .NET> системной директории Windows (обычно Windows или WINNT).using System;public class Counter{public int factorial(int n){if(n == 0) return 1;public class Counter{public int Factorial(int n){if (n == 0) return 1;}}else if(n > 0)return n * factorial(n - 1);elsethrow new IllegalArgumentException("Argument should be >= 0, " +"current value n = " + n);}else if (n > 0)return n * Factorial(n - 1);elsethrow new ArgumentException("Argument should be >= 0, " +"current value n = " + n);public static void main(String[] args){int n = 2;if(args.length > 0){try{n = Integer.parseInt(args[0]);}catch(NumberFormatException e){n = 2;}}public static void Main(string[] args){int n = 2;if (args.Length > 0){try{n = Int32.Parse(args[0]);}catch (Exception){n = 2;}}if(n < 0) n = 2;Counter f = new Counter();System.out.println(f.factorial(n));if (n < 0) n = 2;Counter f = new Counter();Console.WriteLine(f.Factorial(n));}}}КомпиляцияКомпиляцияjavac Counter.javacsc.exe Counter.csВыполнениеВыполнениеjava Counter 5Counter.exe 5РезультатРезультат120120Базовые типы и операции над нимиВ обоих рассматриваемых языках имеются ссылочные типы и типы значений.
Объектыссылочных типов имеют собственную идентичность, на такой объект можно иметь ссылку издругого объекта, они передаются по ссылке, если являются аргументами или результатамиметодов. Объекты типов значений представляют собой значения, не имеющие собственнойидентичности, — все равные между собой значения неотличимы друг от друга, никак нельзясослаться только на одно из них.В обоих языках есть примитивные типы, являющиеся типами значений, для представленияпростых данных: логических, числовых и символьных.В Java только примитивные типы являютсятипами значений, все другие типы —ссылочные, являются наследниками классаjava.lang.Object.Для каждого примитивного типа есть классобертка, который позволяет представлятьзначения этого типа в виде объектов.Между значениями примитивного типа иВ C# есть возможность декларироватьпользовательские типы значений —структурные типы и перечисления.
Ссылочныетипы называются классами и интерфейсами.Структурные типы, так же как и ссылочные,наследуют классу System.Object, которыйтакже можно использовать под именем object.Для каждого примитивного типа естьструктурный тип-обертка. Преобразованиямежду ними производятся неявно, компиляторсчитает их различными именами одного и тогообъектами соответствующего ему классаобертки определены преобразования поумолчанию — упаковка и распаковка(autoboxing и auto-unboxing, введены в Java 5),позволяющие во многих случаях не создаватьобъект по значению и не вычислять значение пообъекту явно.
Но можно производить их и явно.Однако вызывать методы у значенийпримитивных типов нельзя.же типа.Поэтому все элементы класса object имеютсяво всех примитивных типах — у их значенийможно, как у обычных объектов, вызыватьметоды.Вполне законны, например, выражения2.Equals(3) и (-175).ToString().Логический типВ Java он назван boolean, а его обертка — java.lang.Boolean.В C# он назван bool, а его обертка — System.Boolean.Значения этого типа — логические значения, их всего два — true и false. Нет никакихнеявных преобразований между логическими и целочисленными значениями. Над значениямиэтого типа определены следующие операции.•== и != — сравнения на равенство и неравенство.•! — отрицание.•&& и || — условные (короткие) конъюнкция и дизъюнкция (‘и’ и ‘или’).
Второй аргументэтих операций не вычисляется, если по значению первого уже ясно, чему равно значениевыражения, т.е., в случае конъюнкции — если первый аргумент равен false, а в случаедизъюнкции — если первый аргумент равен true. С помощью условного оператора ?: ихможно записать так: (x && y) — ((x)?(y): false), (x || y) — ((x)? true :(y)).Напомним, что означает условный оператор — выражение a?x:y вычисляет значение a,если оно true, то вычисляется и возвращается значение x, иначе вычисляется ивозвращается значение y.•& и | — (длинные) конъюнкция и дизъюнкция (‘и’ и ‘или’). У этих операций обааргумента вычисляются всегда.•^ — исключающее ‘или’ или сумма по модулю 2.•Для операций &, |, ^ имеются соответствующие операторы присваивания &=, |=, ^=.Выражение x op= y, где op — одна из операций &, |, ^, имеет тот же эффект, что ивыражение x = ((x) op (y)), за исключением того, что значение x вычисляется ровноодин раз.Целочисленные типыВ обоих языках имеются следующие целочисленные типы.• Тип байтовых целых чисел, называемый в Java byte, а в C# — sbyte.