четверг, 28 января 2010 г.

50 вопросов MSSQL

1. Поддерживает ли MS SQL вложенные транзакции

В документации говорится о том, что значение системной переменной @@TranCount увеличивается на единицу после выполнения каждого оператора BEGIN TRANSACTION, уменьшается на единицу при выполнении оператора COMMIT, и СБРАСЫВАЕТСЯ в нуль при выполнении каждого оператора ROLLBACK. В той же документации говорится, что вложенные транзакции игнорируются и если даже вложенная транзакция завершилась оператором COMMIT, то внешняя транзакция может закончится оператором ROLLBACK, что приведет к откату вложенной транзакции. Все это верно, но только для описанного случая – когда вложенная транзакция закончена оператором COMMIT. Если же вложенная транзакция закончена оператором ROLLBACK, то отменяются все операции, начиная с оператора BEGIN TRANSACTION самой внешней транзакции. При этом системная переменная @@TranCount устанавливается в нуль. Дальнейшие операторы выполняются вне транзакции, хотя формально они находятся до оператора COMMIT/ROLLBACK внешней транзакции. При выполнении оператора окончания внешней транзакции (все равно COMMIT или ROLLBACK) MS SQL Server выдает сообщение о том, что для данного оператора завершения транзакции нет соответствующего оператора, открывающего транзакцию. Для корректной отработки таких ситуаций MS рекомендует перед каждым оператором завершения внешней транзакции вставлять проверку на значение переменной @@TranCount:

2.

50 вопросов по ASP.Net

1. Спользование WebMethods на страницах.
  -
  - PageMethods.wmMyMethod(3, onSucceeded, onFailed);
  - using System.Web.Services;
  - [WebMethod]
    public static string wmMyMethod(int keyValue) {
      return keyValue * 2;
    }

2. MasterPage
 - <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="SiteMaster.master.cs" Inherits="SiteMaster" %>
  
 - <%@ Page Language="C#" MasterPageFile="~/SiteMaster.Master" AutoEventWireup="true" CodeBehind="pgDefault.aspx.cs" Inherits="pgDefault" %>
   <%@ MasterType VirtualPath="~/SiteMaster.Master" %>
  

3. Жизненый цикл обработки страницы (Page processing life cycle.)
  - User->Request page->Browser->WebServer
  - Step 1 (page request). Compile page or Pull it from cache
  - Step 2 (start). Set Request and Response, determine IsPostBack
  - Step 3 (page init). Initialize page controls (but not their properties). Apply page theme.
  - Step 4 (load). If PostBack, load control properties from view state
  - Step 5 (validation). Validate page and validator controls
  - Step 6 (PostBack event handling). Call Control event handlers (for PostBack requests)
  - Step 7 (rendering). Save view state

  WebServer->Browser->User

  - Step 8 (unload). Unload request and response. Perform cleanup. Disacard the page

4. События обработки страницы (Page Life Cycle Events)
  - PreInit. Первый event используется для указания MasterPage или Темы из кода, также для создания динамических контролов.
  - Init. Вызывается после инициализации каждого контрола
  - InitComplete. Вызыватся после инициализации страницы и всех контролов.
  - PreLoad. Полезен для операций после инициализации, но до загрузки ViewState.
  - Load. Страница инициализирована и состояние реконструровано, сначала вызывается для страницы, потом для контролов на ней. Код обычно проверяет IsPostBack и затем инициализирует свойства контролов.
  - Control (PostBack) event(s). Вызов событий контролов или страницы которые инициировали событие PostBack
  - LoadComplete. На этом этапе, все контролы загружены. Место для дополнительной обработки.
  - PreRender. Для финальных измненений страницы или контролов на странице
  - SaveStateComplete. До этого события, ViewState уже задан. Используется для обработки которая требует что бы ViewState был уже задан.
  - Render. Для генерации HTML, DHTML, Scripts для своих пользовательских контролов
  - UnLoad. Для освобождения Управляемых (Managed) ресурсов использованых в процессе обработки страницы

5. Что такое фильтры ответов Response Filters:
Когда обозреватель запрашивает ASP.NET-страницу с веб-сервера, движок ASP.NET обрабатывает запрос в несколько шагов, результатом которых  будет разметка, возвращенная запрашиваемому обозревателю для последующего отображения. Этапы данного процесса иногда называют HTTP- конвейером , который может выполнить такие задачи, как идентификация, авторизация, а также заставить запрашиваемую страницу обработать свое содержимое. На одном из последних этапов HTTP-конвейера обработанная разметка передается фильтру ответов (response filter), который (при наличии) имеет возможность исследовать и изменить разметку до того, как она будет возвращена запрашиваемому обозревателю.

void Page_Load(){ Response.Filter = new ResponseFilterClassName(Response.Filter)}
 
public class WhitespaceFilterVB: MemoryStream {
  private Stream outputStream = null;
  public void New(Stream output) { outputStream = output; }
  public overrides void Write(Byte[] buffer,int offset, int count){}
} 

6.

среда, 27 января 2010 г.

Инкапсуляция, полиморфизм, наследование

Все языки OOP основаны на трёх основополагающих концепциях, называемых инкапсуляцией, полиморфизмом и наследованием.

1. Инкапсуляция

Инкапсуляция (encapsulation) - это механизм, который объединяет данные и код, манипулирующий зтими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый "чёрный ящик". Когда коды и данные объединяются таким способом, создаётся объект (object). Другими словами, объект - это то, что поддерживает инкапсуляцию.

Внутри объекта коды и данные могут быть закрытыми (private). Закрытые коды или данные доступны только для других частей этого объекта. Таким образом, закрытые коды и данные недоступны для тех частей программы, которые существуют вне объекта. Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.

На самом деле объект является переменной определённого пользователем типа. Может показаться странным, что объект, который объединяет коды и данные, можно рассматривать как переменную. Однако применительно к объектно-ориентированному программированию это именно так. Каждый элемент данных такого типа является составной переменной.

2. Полиморфизм

Полиморфизм (polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций (function overloading).

В более общем смысле, концепцией полиморфизма является идея "один интерфейс, множество методов". Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает мнижать сложность программ, разрешая использование того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Вам, как программисту, не нужно делать этот выбор самому. Нужно только помнить и использовать общий интерфейс. Пример из предыдущего абзаца показывает, как, имея три имени для функции определения абсолютной величины числа вместо одного, обычная задача становится более сложной, чем это действительно необходимо.

Полиморфизм может применяться также и к операторам. Фактически во всех языках программирования ограниченно применяется полиморфизм, например, в арифметических операторах. Так, в Си, символ + используется для складывания целых, длинных целых, символьных переменных и чисел с плавающей точкой. В этом случае компилятор автоматически определяет, какой тип арифметики требуется. В С++ вы можете применить эту концепцию и к другим, заданным вами, типам данных. Такой тип полиморфизма называется перегрузкой операторов (operator overloading).

Ключевым в понимании полиморфизма является то, что он позволяет вам манипулировать объектами различной степени сложности путём создания общего для них стандартного интерфейса для реализации похожих действий.

3. Наследовние

Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации. Например, подумайте об описании жилого дома. Дом - это часть общего класса, называемого строением. С другой стороны, строение - это часть более общего класса - конструкции, который является частью ещё более общего класса объектов, который можно назвать созданием рук человека. В каждом случае порождённый класс наследует все, связанные с родителем, качества и добавляет к ним свои собственные определяющие характеристики. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы исчерпывающи его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным. Наследование играет очень важную роль в OOP.