<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Nikolay Grigorev</title><author><name>Nikolay Grigorev</name></author><id>https://teletype.in/atom/ngrigorev</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/ngrigorev?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@ngrigorev?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ngrigorev"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/ngrigorev?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-30T11:08:58.569Z</updated><entry><id>ngrigorev:-aGa3esxsHI</id><link rel="alternate" type="text/html" href="https://teletype.in/@ngrigorev/-aGa3esxsHI?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ngrigorev"></link><title>TypeSrcipt. Part 2</title><published>2022-09-15T11:33:14.288Z</published><updated>2022-09-15T12:02:55.636Z</updated><summary type="html">Оператор, который формирует литеральный тип из строк или чисел из типа</summary><content type="html">
  &lt;h2 id=&quot;ehII&quot;&gt;KeyOf&lt;/h2&gt;
  &lt;p id=&quot;Mhpp&quot;&gt;Оператор, который формирует литеральный тип из строк или чисел из типа&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;oHRz&quot;&gt;&lt;code&gt;interface A {&lt;br /&gt;  prop1: number;&lt;br /&gt;  prop2: number;&lt;br /&gt;  prop3: number;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;1RPl&quot;&gt;&lt;code&gt;type B = keyof A;    // B = &amp;#x27;prop1&amp;#x27; | &amp;#x27;prop2&amp;#x27; | &amp;#x27;prop3&amp;#x27;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;EzS7&quot;&gt;&lt;code&gt;let b: B = &amp;#x27;prop1&amp;#x27;;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;FDXW&quot;&gt;&lt;code&gt;interface A {&lt;br /&gt;  prop1: number;&lt;br /&gt;  prop2: number;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;ugHc&quot;&gt;&lt;code&gt;type B =  {&lt;br /&gt;  [K in keyof A]: any;&lt;br /&gt;};&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;uXq3&quot;&gt;&lt;code&gt;const b: B = {&lt;br /&gt;  prop1: 0,&lt;br /&gt;  prop2: 1&lt;br /&gt;};&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;wuTW&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;qh83&quot;&gt;Readonly, Readonly&amp;lt;T&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;ZJuz&quot;&gt;Оператор, который делает свойство типа только на чтение&lt;/p&gt;
  &lt;p id=&quot;Q09y&quot;&gt;Тип, который делает все свойства типа T только на чтение&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;oBf0&quot;&gt;&lt;code&gt;interface A {&lt;br /&gt;  readonly prop: number;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;BYkd&quot;&gt;&lt;code&gt;type B = {&lt;br /&gt;  readonly prop: number;&lt;br /&gt;};&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;QoHV&quot;&gt;&lt;code&gt;type ReadonlyB = Readonly&amp;lt;B&amp;gt;;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;danQ&quot;&gt;&lt;code&gt;class C {&lt;br /&gt;  readonly prop = 0;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Z5Qv&quot;&gt;&lt;code&gt;const reaonlyD: ReadonlyArray&amp;lt;number&amp;gt; = [1, 2, 3];&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;7NX3&quot;&gt;&lt;code&gt;const reaonlyE: readonly number[] = [10, 20, 30];&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;nKv8&quot;&gt;&lt;code&gt;const reaonlyF: Readonly&amp;lt;number&amp;gt; = 10;    // const reaonlyF = 10&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;EUNP&quot;&gt;const reaonlyF: Readonly&amp;lt;number&amp;gt; = 10; // const reaonlyF = 10&lt;/p&gt;
  &lt;h2 id=&quot;tB4J&quot;&gt;Partial&amp;lt;T&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;4Rdr&quot;&gt;Тип, который делает свойства типа T необязательными&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;ZyNh&quot;&gt;&lt;code&gt;interface A {&lt;br /&gt;  AA: number;&lt;br /&gt;  BB: number;&lt;br /&gt;  CC: number;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;eOrg&quot;&gt;&lt;code&gt;type B = Partial&amp;lt;A&amp;gt;;     // interface B { AA?: number;… }&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;2pub&quot;&gt;&lt;code&gt;let b: B = { AA: 0 };&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;uMk0&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;6CRb&quot;&gt;Omit&amp;lt;T, K&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;gdrG&quot;&gt;Тип, который исключает из типа Т свойства&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;SV80&quot;&gt;&lt;code&gt;interface A {&lt;br /&gt;  AA: number;&lt;br /&gt;  BB: number;&lt;br /&gt;  CC: number;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;Pgp1&quot;&gt;&lt;code&gt;type B = Omit&amp;lt;A, &amp;#x27;CC&amp;#x27;&amp;gt;;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;dGRO&quot;&gt;&lt;code&gt;let b: B = {&lt;br /&gt;  AA: 0,&lt;br /&gt;  BB: 1&lt;br /&gt;};&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;jmX1&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Qsl1&quot;&gt;Pick&amp;lt;T, K&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;bK9Y&quot;&gt;Тип, который исключает из типа Т все свойства, кроме указанных&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;H53L&quot;&gt;&lt;code&gt;interface Todo {&lt;br /&gt;  title: string;&lt;br /&gt;  description: string;&lt;br /&gt;  completed: boolean;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;nsDn&quot;&gt;&lt;code&gt;type TodoPreview = Pick&amp;lt;Todo, &amp;#x27;title&amp;#x27; | &amp;#x27;completed&amp;#x27;&amp;gt;;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;Oxf5&quot;&gt;&lt;code&gt;const todo: TodoPreview = {&lt;br /&gt;  title: &amp;#x27;Clean room&amp;#x27;,&lt;br /&gt;  completed: false&lt;br /&gt;};&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;uSKH&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;HS8l&quot;&gt;Exclude&amp;lt;T, E&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;HWIs&quot;&gt;Тип, который исключает значения из литеральных типов. Omit только для литеральных&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;9Huj&quot;&gt;&lt;code&gt;type T0 = Exclude&amp;lt;&amp;#x27;a&amp;#x27; | &amp;#x27;b&amp;#x27; | &amp;#x27;c&amp;#x27;, &amp;#x27;a&amp;#x27;&amp;gt;;&lt;br /&gt;// T0: &amp;#x27;b&amp;#x27; | &amp;#x27;c&amp;#x27;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;1Odf&quot;&gt;&lt;code&gt;type T1 = Exclude&amp;lt;&amp;#x27;a&amp;#x27; | &amp;#x27;b&amp;#x27; | &amp;#x27;c&amp;#x27;, &amp;#x27;a&amp;#x27; | &amp;#x27;b&amp;#x27;&amp;gt;;&lt;br /&gt;// T1: &amp;#x27;c&amp;#x27;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;2xpb&quot;&gt;&lt;code&gt;type T2 = Exclude&amp;lt;string | number | (() =&amp;gt; void), Function&amp;gt;;&lt;br /&gt;// T2: string | number&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;hyBC&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;CEmc&quot;&gt;Extract&amp;lt;T, E&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;92rf&quot;&gt;Тип, который исключает все значения литерального типов, кроме переданных. Pick только для литеральных&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;oTz2&quot;&gt;&lt;code&gt;type T0 = Extract&amp;lt;&amp;#x27;a&amp;#x27; | &amp;#x27;b&amp;#x27; | &amp;#x27;c&amp;#x27;, &amp;#x27;a&amp;#x27;&amp;gt;;&lt;br /&gt;// T0: &amp;#x27;a&amp;#x27;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;gZlC&quot;&gt;&lt;code&gt;type T1 = Extract&amp;lt;&amp;#x27;a&amp;#x27; | &amp;#x27;b&amp;#x27; | &amp;#x27;c&amp;#x27;, &amp;#x27;a&amp;#x27; | &amp;#x27;b&amp;#x27;&amp;gt;;&lt;br /&gt;// T1: &amp;#x27;a&amp;#x27; | &amp;#x27;b&amp;#x27;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;F2gN&quot;&gt;&lt;code&gt;type T2 = Extract&amp;lt;string | number | (() =&amp;gt; void), Function&amp;gt;;&lt;br /&gt;// T2: () =&amp;gt; void&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;HGAv&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;M3NS&quot;&gt;NonNullable&amp;lt;T&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;aqUz&quot;&gt;Тип, который не дает присваивать значения null и undefined&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;0eSa&quot;&gt;&lt;code&gt;type T0 = NonNullable&amp;lt;string | number | undefined&amp;gt;;&lt;br /&gt;// T0 = string | number&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;onST&quot;&gt;&lt;code&gt;type T1 = NonNullable&amp;lt;string[] | null | undefined&amp;gt;;&lt;br /&gt;// T1 = string[]&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;V8Xw&quot;&gt;&lt;code&gt;const t: T1 = null;&lt;br /&gt;// error. Type &amp;#x27;null&amp;#x27; is not assignable to type &amp;#x27;string[]&amp;#x27;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;pVgt&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;xrdV&quot;&gt;Parameters&amp;lt;T&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;1u3o&quot;&gt;Тип, который формирует кортеж из входных параметров функции типа Т&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;72yA&quot;&gt;&lt;code&gt;type T0 = Parameters&amp;lt;() =&amp;gt; string&amp;gt;;&lt;br /&gt;// type T0 = [];&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;Ut9G&quot;&gt;&lt;code&gt;const t0: T0 = [];&lt;br /&gt;const t0_2: T0 = [1, 2, 3];&lt;br /&gt;// error. Type &amp;#x27;[number, number, number]&amp;#x27; is not assignable to type &amp;#x27;[]&amp;#x27;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;NQEY&quot;&gt;&lt;code&gt;type T1 = Parameters&amp;lt;(s: string) =&amp;gt; void&amp;gt;;&lt;br /&gt;// T1 = [s: string]&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;yyRw&quot;&gt;&lt;code&gt;const t1: T1 = [&amp;#x27;str&amp;#x27;];&lt;br /&gt;const t1_2: T1 = [&amp;#x27;str1&amp;#x27;, &amp;#x27;str2&amp;#x27;];&lt;br /&gt;// error. Type &amp;#x27;[string, string]&amp;#x27; is not assignable to type &amp;#x27;[s: string]&amp;#x27;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;4e5J&quot;&gt;&lt;code&gt;type T2 = Parameters&amp;lt;&amp;lt;T&amp;gt;(a: string, b: number) =&amp;gt; boolean&amp;gt;;&lt;br /&gt;// T2 = [a: string, b: number]&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;G3vs&quot;&gt;&lt;code&gt;const t2: T2 = [&amp;#x27;atr&amp;#x27;, 2];&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;nBBQ&quot;&gt;&lt;code&gt;type T4 = Parameters&amp;lt;any&amp;gt;;&lt;br /&gt;// T4 = unknown[]&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;hCHA&quot;&gt;&lt;code&gt;type T5 = Parameters&amp;lt;never&amp;gt;;&lt;br /&gt;// T5 = never&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;Z70s&quot;&gt;&lt;code&gt;type T6 = Parameters&amp;lt;string&amp;gt;;&lt;br /&gt;// error&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;ed8J&quot;&gt;&lt;code&gt;type T7 = Parameters&amp;lt;Function&amp;gt;;&lt;br /&gt;// error&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;DNn1&quot;&gt;Есть подобные тип:&lt;/p&gt;
  &lt;ul id=&quot;yYmO&quot;&gt;
    &lt;li id=&quot;zzzp&quot;&gt;ConstructorParameters&amp;lt;Type&amp;gt;&lt;/li&gt;
    &lt;li id=&quot;yLsn&quot;&gt;ReturnType&amp;lt;Type&amp;gt;&lt;/li&gt;
    &lt;li id=&quot;mM44&quot;&gt;InstanceType&amp;lt;Type&amp;gt;&lt;/li&gt;
    &lt;li id=&quot;bHLb&quot;&gt;ThisParameterType&amp;lt;Type&amp;gt;&lt;/li&gt;
    &lt;li id=&quot;fmnG&quot;&gt;OmitThisParameter&amp;lt;Type&amp;gt;&lt;/li&gt;
    &lt;li id=&quot;G1ks&quot;&gt;ThisType&amp;lt;Type&amp;gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;aruo&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;gVyx&quot;&gt;Record&amp;lt;U, T&amp;gt;&lt;/h2&gt;
  &lt;p id=&quot;2lvk&quot;&gt;Тип, который формирует новый тип с полями из литерального типа U, где в свою очередь типы этих полей является типом T&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;yxLw&quot;&gt;&lt;code&gt;interface ICat {&lt;br /&gt;  age: number;&lt;br /&gt;  breed: string;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;rwnn&quot;&gt;&lt;code&gt;type CatName = &amp;#x27;BORIS&amp;#x27; | &amp;#x27;MURKA&amp;#x27; | &amp;#x27;KISS KISS&amp;#x27;;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;78tD&quot;&gt;&lt;code&gt;const cats: Record&amp;lt;CatName, ICat&amp;gt; = {&lt;br /&gt;  BORIS: { age: 10, breed: &amp;#x27;Persian&amp;#x27; },&lt;br /&gt;  MURKA: { age: 5, breed: &amp;#x27;Maine Coon&amp;#x27; },&lt;br /&gt;  [&amp;#x27;KISS KISS&amp;#x27;]: { age: 16, breed: &amp;#x27;British Shorthair&amp;#x27; }&lt;br /&gt;};&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;5P3B&quot;&gt;&lt;code&gt;const objs: Record&amp;lt;&amp;#x27;A&amp;#x27; | &amp;#x27;B&amp;#x27;, { aa: boolean, bb: number }&amp;gt; = {&lt;br /&gt;  A: { aa: true, bb: 1 },&lt;br /&gt;  B: { aa: false, bb: 2 }&lt;br /&gt;};&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;nTXx&quot;&gt;&lt;code&gt;interface A {&lt;br /&gt;  A: number; B: string;&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;F9uc&quot;&gt;&lt;code&gt;const objs: Record&amp;lt;keyof A, { aa: boolean, bb: number }&amp;gt; = {&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;D8dq&quot;&gt;&lt;code&gt;A: { aa: true, bb: 1 },&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;mE7Z&quot;&gt;&lt;code&gt;B: { aa: false, bb: 2 }&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;M83w&quot;&gt;&lt;code&gt;};&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;xXeb&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;intrinsic-string-manipulation-types&quot;&gt;Intrinsic String Manipulation Types&lt;/h2&gt;
  &lt;p id=&quot;ar5Q&quot;&gt;Встроенные типы манипуляций со строками&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;rAjb&quot;&gt;&lt;code&gt;let upperText:Uppercase&amp;lt;string&amp;gt;;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;tq1R&quot;&gt;&lt;code&gt;upperText = &amp;quot;HELLO, WORLD&amp;quot;;&lt;br /&gt;upperText = &amp;quot;Hello, World&amp;quot;;&lt;br /&gt;// error. Type &amp;#x27;string&amp;#x27; is not assignable to type &amp;#x27;Uppercase&amp;lt;string&amp;gt;&amp;#x27;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;zgUD&quot;&gt;&lt;code&gt;let lowerText:Lowercase&amp;lt;string&amp;gt;;&lt;br /&gt;lowerText = &amp;quot;hello, world&amp;quot;;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;lml1&quot;&gt;&lt;code&gt;let capitalizeText:Capitalize&amp;lt;string&amp;gt;;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;YXBz&quot;&gt;&lt;code&gt;capitalizeText = &amp;quot;Hello, world&amp;quot;;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Trz4&quot;&gt;&lt;code&gt;let uncapitalizeText:Uncapitalize&amp;lt;string&amp;gt;;&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;RRx5&quot;&gt;&lt;code&gt;uncapitalizeText = &amp;quot;hELLO, WORLD&amp;quot;;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>ngrigorev:BTRy7xFPF</id><link rel="alternate" type="text/html" href="https://teletype.in/@ngrigorev/BTRy7xFPF?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ngrigorev"></link><title>Лекция 2. Разработка систем на основе шаблонов</title><published>2020-09-15T09:18:06.250Z</published><updated>2020-09-15T09:18:06.250Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/b5/c3/b5c3b426-fcd4-49fc-a2c4-fbf9d936f24a.png"></media:thumbnail><category term="topic14018" label="Курс АрхИС"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/b5/c3/b5c3b426-fcd4-49fc-a2c4-fbf9d936f24a.png&quot;&gt;Шаблоны проектирования представляют собой стандартные решения периодически повторяющихся проблем.</summary><content type="html">
  &lt;h2&gt;&lt;strong&gt;Задачу, над которой вы сейчас работаете, кто-то уже наверняка решал!&lt;/strong&gt;&lt;/h2&gt;
  &lt;h2&gt;Шаблон проектирования (Design Pattern)&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Шаблоны проектирования&lt;/strong&gt; представляют собой стандартные решения периодически повторяющихся проблем.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Шаблонам даны имена, чтобы облегчить специалистам их обсуждение;&lt;/li&gt;
    &lt;li&gt;Шаблоны представляют абстрактные базовые решения проблем, которые могут возникать в разных контекстах. Конкретная реализация в разных приложениях может быть различной.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;История шаблонов. Строительство&lt;/h2&gt;
  &lt;p&gt;1964. Работы &lt;strong&gt;Кристофера Александера&lt;/strong&gt; в области строительства.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Причина: возросшая сложность требований и совершенствование материалов;&lt;/li&gt;
    &lt;li&gt;Общий принцип: отказ от случайных принципов проектирования;&lt;/li&gt;
    &lt;li&gt;Результат: 11 томов проектных решений (опубликованы 8). 243 взаимосвязанных проектных шаблона&lt;/li&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Waist-High Shelf (полка на уровне пояса)&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Thickening The Outer Wall (утолщение наружной стены)&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Things From Your Life (вещи вашей жизни).&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;h2&gt;История шаблонов. Программное обеспечение&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;1991. Э. Гамма, Р.Хелм, Р. Джонсон, Д. Влиссидес. Конференция Object-Oriented programming,  Languages &amp;amp; Applications:&lt;/li&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Результатом встречи стала совместная разработка 23 шаблонов проектирования Gang of Four (GoF)&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li&gt;1993. Кент Бек, Вард Каннингам. Привлечение идей Александера к разработке систем на базе метафор:&lt;/li&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Идеи положены в основу eXtreme Programming&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li&gt;2003. Мартин Фаулер. Patterns of Enterprise Application Architecture.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Зачем учить шаблоны?&lt;/h2&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b5/c3/b5c3b426-fcd4-49fc-a2c4-fbf9d936f24a.png&quot; width=&quot;865&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Паттерны не сразу воплощаются в вашем коде - сначала они должны проникнуть в ваш мозг. Когда вы начнете достаточно хорошо разбираться в паттернах, вы  можете применять их в своих новых архитектурах, а также перерабатывать старый код, который со временем превращается в хаотическое месиво.&lt;/p&gt;
  &lt;p&gt;Вопрос: &lt;em&gt;Если паттерны так хороши, почему никто не оформил их в виде библиотеки?&lt;/em&gt;&lt;br /&gt;Ответ: &lt;em&gt;Паттерны относятся к более высокому уровню, чем библиотеки. Они&lt;br /&gt;определяют способы структурирования классов и объектов для решения некоторых задач, а наша задача – адаптировать их для своих конкретных приложений.&lt;/em&gt;&lt;/p&gt;
  &lt;h2&gt;Единая номенклатура&lt;/h2&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/81/ce/81ce5375-aee5-42bf-a8e4-003f4cbb9fce.png&quot; width=&quot;544&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Номенклатуры паттернов обладают большой &lt;strong&gt;ВЫРАЗИТЕЛЬНОСТЬЮ&lt;/strong&gt;. Используя паттерны в общении с другим разработчиком или группой, вы передаете не только название паттерна, но целый набор характеристик, качеств и ограничений, представленных данным паттерном.&lt;/p&gt;
  &lt;p&gt;Паттерны позволяют сказать больше &lt;strong&gt;меньшим количеством слов&lt;/strong&gt;. Когда вы используете паттерн в описании, другие разработчики моментально понимают суть решения, о котором вы говорите.&lt;/p&gt;
  &lt;p&gt;Общение на уровне паттернов помогает дольше оставаться &lt;strong&gt;«на уровне архитектуры»&lt;/strong&gt;. Описание программной системы с использованием паттернов позволяет вести обсуждение на более абстрактном уровне, не отвлекаясь на второстепенные подробности реализации объектов и классов.&lt;/p&gt;
  &lt;p&gt;Единая номенклатура &lt;strong&gt;повышает эффективность разработки&lt;/strong&gt;. Группа, хорошо разбирающаяся в паттернах проектирования, быстрее продвигается вперед, а ее участники лучше понимают друг друга. Единые номенклатуры помогают новичкам разработчикам быстрее войти в курс дела. Новички берут пример с опытных разработчиков. Если опытный разработчик применяет паттерны в своей работе, у новичков появляются дополнительные стимулы для их использования. Создайте сообщество пользователей паттернов в своей организации.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9a/df/9adfe379-5ed3-48a2-9c00-d0a6426555b2.png&quot; width=&quot;915&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Более увлекательная книга по паттернам для новичков&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/6a/48/6a4822fb-57fd-4262-9007-b8fe38ddac55.png&quot; width=&quot;446&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Состав шаблона (по GoF)&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Имя&lt;/strong&gt;. Сославшись на имя мы сразу можем описать проблему проектирования, её решение и следствия;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Описание того, когда следует применять шаблон, т.е. контекст;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Решение&lt;/strong&gt;. Описание элементов дизайна, отношений между ними и функций каждого элемента;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Результаты&lt;/strong&gt;. Следствия применения шаблона и разного рода компромиссы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Классификация шаблонов проектирования&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Распределения обязанностей&lt;/li&gt;
    &lt;li&gt;Порождающие&lt;/li&gt;
    &lt;li&gt;Структурные&lt;/li&gt;
    &lt;li&gt;Поведения&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;strong&gt;GRASP &lt;/strong&gt;(&lt;strong&gt;General Responsibility Assignment Software Patterns &lt;/strong&gt;— общие шаблоны распределения обязанностей) — паттерны, используемые в ООП для решения общих задач по назначению обязанностей классам и объектам.&lt;/p&gt;
  &lt;p&gt;Каждый из паттернов &lt;strong&gt;GRASP&lt;/strong&gt; помогает решить некоторую проблему, возникающую при объектно-ориентированном анализе, и которая возникает практически в любом проекте по разработке программного обеспечения. Таким образом, GRASP-паттерны — это хорошо документированные, cтандартизированные и проверенные временем принципы объектно-ориентированного анализа, а не попытка привнести что-то принципиально новое.&lt;/p&gt;
  &lt;h3&gt;GRASP-паттерны&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Information Expert – Информационный эксперт (Эксперт)&lt;/li&gt;
    &lt;li&gt;Creator – Создатель&lt;/li&gt;
    &lt;li&gt;High Cohesion  - Высокое зацепление&lt;/li&gt;
    &lt;li&gt;Low Coupling  - Низкая связность&lt;/li&gt;
    &lt;li&gt;Pure Fabrication – Чистая синтетика&lt;/li&gt;
    &lt;li&gt;Indirection - Посредник&lt;/li&gt;
    &lt;li&gt;Do Not Talk to Strangers – Не разговаривай с незнакомцами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Information Expert (Эксперт)&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Каков наиболее общий принцип распределения обязанностей между объектами?&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Решение&lt;/strong&gt;. Назначить обязанность информационному эксперту – классу у которого имеется вся информация для выполнения обязанности.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a0/69/a069971d-1d13-4d70-bbf1-71de2e6408f9.png&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Шаблон Information Expert&lt;/strong&gt; определяет базовый принцип назначения обязанностей. Он утверждает, что обязанности должны быть назначены объекту, который владеет максимумом необходимой информации для выполнения обязанности. Такой объект называется информационным экспертом. Возможно, этот шаблон является самым очевидным из девяти, но вместе с тем и самым важным.&lt;br /&gt;&lt;br /&gt;Если дизайн не удовлетворяет этому принципу, то при программировании получается спагетти-код, в котором очень трудно разбираться. Локализация обязанностей позволяет повысить уровень инкапсуляции и уменьшить уровень связанности. Кроме читабельности кода повышается уровень готовности компонента к повторному использованию.&lt;/p&gt;
  &lt;h2&gt;Creator&lt;/h2&gt;
  &lt;p&gt;Экземпляры B должны порождать экземпляры A, если:  &lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Класс B &lt;strong&gt;содержит &lt;/strong&gt;или &lt;strong&gt;агрегирует &lt;/strong&gt;объекты A;&lt;/li&gt;
    &lt;li&gt;Класс B &lt;strong&gt;записывает &lt;/strong&gt;экземпляры объектов A;&lt;/li&gt;
    &lt;li&gt;Класс B &lt;strong&gt;активно использует&lt;/strong&gt; объекты A;&lt;/li&gt;
    &lt;li&gt;Класс B &lt;strong&gt;обладает данными инициализации&lt;/strong&gt; для объектов A.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;strong&gt;Шаблон Creator&lt;/strong&gt; решает, кто должен создавать объект. Фактически, это применение &lt;strong&gt;шаблона Information Expert&lt;/strong&gt; к проблеме &lt;strong&gt;создания &lt;/strong&gt;объектов. Более конкретно, нужно назначить классу B обязанность создавать экземпляры класса A, если выполняется как можно больше из выше указанных условий.&lt;br /&gt;Альтернативой создателю является шаблон проектирования Фабрика. В этом случае создание объектов концентрируется в отдельном классе.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/94/6b/946bbd7d-3ab3-432b-9972-b0d159d7acc4.png&quot; width=&quot;461&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Controller&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Кто должен отвечать за обработку входных системных сообщений?&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Решение&lt;/strong&gt;. Делегировать обязанности по обработке системных сообщений классу, удовлетворяющему одному из следующих условий:&lt;/li&gt;
    &lt;ul&gt;
      &lt;li&gt;Класс представляет систему в целом;&lt;/li&gt;
      &lt;li&gt;Класс представляет собой сценарий прецедента:&lt;/li&gt;
      &lt;ul&gt;
        &lt;li&gt;&amp;lt;Прецедент&amp;gt;Controller – описывает шаги прецедента;&lt;/li&gt;
        &lt;li&gt;&amp;lt;Прецедент&amp;gt;Session – состояние выполнения сценария (Применим в stateless-системах, например, WEB).&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;strong&gt;Контроллер &lt;/strong&gt;берёт на себя ответственность за выполнение операций, приходящих от пользователя и часто выполняет сценарий одного или нескольких вариантов использования (например, один контроллер может обрабатывать сценарии создания и удаления пользователя). Как правило, контроллер не выполняет работу самостоятельно, а делегирует обязанности компетентным объектам.&lt;/p&gt;
  &lt;p&gt;Иногда класс-контроллер представляет всю систему в целом, корневой объект, устройство или важную подсистему (внешний контроллер).&lt;/p&gt;
  &lt;h2&gt;Low Coupling  (низкая связанность)&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Как снизить влияние изменений и  повысить степень повторного использования?&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Решение&lt;/strong&gt;. Распределять обязанности, что бы связанность оставалась низкой.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/32/7a/327a8497-cc58-48af-b3db-a8d4cbf9100f.png&quot; width=&quot;781&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;High Cohesion (высокое зацепление)&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Как обеспечить возможность управления сложностью?&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Решение&lt;/strong&gt;. Распределять обязанности, поддерживая высокую  степень зацепления.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/4f/95/4f95ff9a-bcfb-44c8-8ed2-d7baaf185de6.png&quot; width=&quot;730&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Polymorphism&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Полиморфизм &lt;/strong&gt;позволяет обрабатывать альтернативные варианты поведения на основе типа и заменять подключаемые компоненты системы. Обязанности распределяются для различных вариантов поведения с помощью полиморфных операций для этого класса. Все альтернативные реализации приводятся к общему интерфейсу.&lt;br /&gt;&lt;br /&gt;Пример: Strategy, State (GoF)&lt;/p&gt;
  &lt;h2&gt;Pure Fabrication («Чистая выдумка» или «Чистая синтетика»)&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Задача&lt;/strong&gt;. Какой класс должен обеспечить реализацию Low Coupling и High&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Cohesion&lt;/strong&gt;, если Information Expert не обеспечивает подходящего решения?&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Решение&lt;/strong&gt;. Присвоить группу обязанностей с высокой степенью зацепления классу, не представляющему конкретного понятия предметной области&lt;br /&gt;&lt;br /&gt;Пример: Production, Repository,  (GoF)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Indirection (Непрямое связывание)&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Проблема&lt;/strong&gt;. Как распределить обязанности, при отсутствии прямого связывания между объектами?&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Решение&lt;/strong&gt;. Присвоить обязанности промежуточному объекту для обеспечения связи между объектами или службами&lt;br /&gt;&lt;br /&gt;Пример : Adapter (GoF), MVC&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Protected Variations (Защита от изменений)&lt;/h2&gt;
  &lt;p&gt;&lt;strong&gt;Шаблон Protected Variations&lt;/strong&gt; защищает элементы от изменения других элементов (объектов или подсистем) с помощью вынесения взаимодействия в фиксированный интерфейс. Всё взаимодействие между элементами должно происходить через него. Поведение может варьироваться лишь с помощью создания другой реализации интерфейса.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/90/3f/903ff82c-843f-47d8-9b34-93b0e5ce0204.png&quot; width=&quot;937&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote&gt;&lt;strong&gt;Разработчик&lt;/strong&gt;: Хм, но разве дело не сводится к ОО-проектированию? Если я следую принципам инкапсуляции, знаю об абстракции, наследовании и полиморфизме. то зачем мне думать о паттернах проектирования? Для чего тогда были нужны те курсы ОО-проектирования? Я думаю, паттерны проектирования полезны только тем, кто не разбирается&lt;br /&gt;в ОО-проектировании.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Гуру&lt;/strong&gt;: О, это одно из известных заблуждений объектно-ориентированной разработки: будто знание основ ООП автоматически позволит вам строить гибкие, удобные в сопровождении и при годные к повторному использованию системы.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Разработчик&lt;/strong&gt;: Нет?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Гуру&lt;/strong&gt;: Нет. Более того, принципы построения ОО-систем, обладающих&lt;br /&gt;такими свойствами, далеко не всегда очевидны.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Разработчик&lt;/strong&gt;: Кажется, я начинаю понимать. И на основе этих неочевидных&lt;br /&gt;принципов построения объектно-ориентированных систем&lt;br /&gt;были сформулированы ...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Гуру&lt;/strong&gt;: ... да, были сформулированы паттерны проектирования.&lt;/blockquote&gt;

</content></entry><entry><id>ngrigorev:fbxk7-Smx</id><link rel="alternate" type="text/html" href="https://teletype.in/@ngrigorev/fbxk7-Smx?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ngrigorev"></link><title>Лекция 1</title><published>2020-09-08T09:14:36.490Z</published><updated>2020-11-09T14:26:02.543Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/98/73/98736fe9-6cbd-4727-9fa4-a1c730b1de48.png"></media:thumbnail><category term="topic14018" label="Курс АрхИС"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/98/73/98736fe9-6cbd-4727-9fa4-a1c730b1de48.png&quot;&gt;В широком смысле информационная система есть совокупность технического, программного и организационного обеспечения, а также персонала, предназначенная для того, чтобы своевременно обеспечивать надлежащих людей надлежащей информацией (Википедия)</summary><content type="html">
  &lt;h2&gt;Информационная система&lt;/h2&gt;
  &lt;blockquote&gt;В широком смысле информационная система есть совокупность технического, программного и организационного обеспечения, а также персонала, предназначенная для того, чтобы своевременно обеспечивать надлежащих людей надлежащей информацией&lt;em&gt; (&lt;a href=&quot;https://ru.wikipedia.org/wiki/%25D0%2598%25D0%25BD%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D1%2586%25D0%25B8%25D0%25BE%25D0%25BD%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2581%25D0%25B8%25D1%2581%25D1%2582%25D0%25B5%25D0%25BC%25D0%25B0&quot; target=&quot;_blank&quot;&gt;Википедия&lt;/a&gt;)&lt;/em&gt;&lt;/blockquote&gt;
  &lt;blockquote&gt;Информационной системой называется комплекс, включающий вычислительное и коммуникационное оборудование, программное обеспечение, лингвистические средства и информационные ресурсы, а также системный персонал обеспечивающий поддержку динамической информационной модели некоторой части реального мира для удовлетворения информационных потребностей пользователей &lt;em&gt;(М. Р. Когаловский)&lt;/em&gt;&lt;/blockquote&gt;
  &lt;h2&gt;Классификация ИС&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;По архитектуре&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/98/73/98736fe9-6cbd-4727-9fa4-a1c730b1de48.png&quot; width=&quot;665&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul&gt;
    &lt;li&gt;По степени автоматизации&lt;/li&gt;
    &lt;li&gt;По характеру обработки данных&lt;/li&gt;
    &lt;li&gt;По сфере применения&lt;/li&gt;
    &lt;li&gt;По масштабу&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Архитектура ИС&lt;/h2&gt;
  &lt;h3&gt;Откуда &amp;quot;берется&amp;quot; архитектура&lt;/h3&gt;
  &lt;p&gt;Архитектура информационной системы формируется как результат анализа требований к информационной системе с целью их удовлетворения в рамках оговоренных ресурсов (технических, временных, людских и т.п.)&lt;/p&gt;
  &lt;h3&gt;Архитектурные слои, уровни, подсистемы и компоненты&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Подсистема (Subsystem)&lt;/strong&gt;. Набор взаимодействующих компонентов, работающих совместно для достижения определённой цели;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Компонент (Component)&lt;/strong&gt;. Структурная составляющая подсистемы;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Слой (Layer)&lt;/strong&gt;. Группирует логически связанные подсистемы и определяет правила для связи между слоями;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Уровень (Tire)&lt;/strong&gt;. Аппаратный компонент распределённой системы на котором может функционировать слой.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Принципы проектирование слоев&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;В каждом слое ничего неизвестно о слоях более высокого уровня;&lt;/li&gt;
    &lt;li&gt;В каждом слое ничего неизвестно о строении других слоёв. Связь осуществляется только через интерфейсы подсистем;&lt;/li&gt;
    &lt;li&gt;Некоторые компоненты подсистем являются внутренними для  подсистемы, другие имеют интерфейсы для подсистем верхнего слоя;&lt;/li&gt;
    &lt;li&gt;Предположения относительно существования других слоёв являются минимальными&lt;/li&gt;
    &lt;li&gt;Связь между подсистемами ограничена явными аргументами. Глобальные данные недопустимы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9f/3c/9f3c477b-4c80-48a3-8217-cb8aef616742.png&quot; width=&quot;524&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Преимущества слоев (М. Фаулер)&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Каждый слой можно воспринимать как единое целое, не заботясь о наличии других слоёв;&lt;/li&gt;
    &lt;li&gt;Можно выбирать альтернативную реализацию базовых слоёв;&lt;/li&gt;
    &lt;li&gt;Зависимости между слоями можно свести к минимуму;&lt;/li&gt;
    &lt;li&gt;Каждый слой является удачным кандидатом на стандартизацию;&lt;/li&gt;
    &lt;li&gt;Созданный слой может служить основой для нескольких различных слоёв более высокого уровня.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Недостатки слоев&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Изменения в одном из слоёв базового уровня часто приводят к каскадным изменениям в слоях более высокого уровня (пример: новый атрибут в таблице БД);&lt;/li&gt;
    &lt;li&gt;Наличие избыточных слоёв может снизить производительность системы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Три основных слоя&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Представление (Presentation)&lt;br /&gt;&lt;/strong&gt;Предоставление услуг, отображение данных, обработка событий пользовательского интерфейса;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Домен (Domain)&lt;br /&gt;&lt;/strong&gt;Бизнес-логика приложения&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Источники данных (Data Source)/ Слой доступа к данным (Data Access Layer или DAL)&lt;br /&gt;&lt;/strong&gt;Обращение к базе данных, обмен сообщениями, управление транзакциями и т. д.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Распределение слоёв по уровням&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a3/bb/a3bb9581-6f67-4ce8-8fa5-717aa20b5e15.png&quot; width=&quot;942&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Традиционные архитектуры&lt;/h2&gt;
  &lt;h3&gt;Централизованная архитектура&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/7e/0a/7e0ab1b1-7145-4b80-8133-434f5b2377ca.png&quot; width=&quot;967&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;70-e годы. Эпоха мейнфреймов - больших централизованных ЭВМ.&lt;/p&gt;
  &lt;p&gt;Основные особенности:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Все базовые функции приложения реализуются в одной месте&lt;/li&gt;
    &lt;li&gt;Все пользователи работают одновременно на одном компьютере&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Плюсы:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;«Нулевое» администрирование рабочих мест пользователей;&lt;/li&gt;
    &lt;li&gt;Централизованная разработка и обслуживание системы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Минусы:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Дорогая аппаратура оправдана только для больших систем;&lt;/li&gt;
    &lt;li&gt;Взаимная зависимость пользователей на программном уровне.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Персональные компьютеры&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/67/99/6799128c-20ad-44de-9822-63e183e9054c.png&quot; width=&quot;967&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Начало 80-х — персональные компьютеры.&lt;/p&gt;
  &lt;p&gt;Основные особенности:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Все базовые функции приложения реализуются в одной месте;&lt;/li&gt;
    &lt;li&gt;Однопользовательский режим работы приложений.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Плюсы:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Полная автономность работы. Мобильность приложений;&lt;/li&gt;
    &lt;li&gt;Развитый пользовательский интерфейс - как следствие монополизации &lt;br /&gt;аппаратного обеспечения.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Минусы:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Серьезные ограничения в вычислительной мощности;&lt;/li&gt;
    &lt;li&gt;Крайне затруднен обмен данными. Дублирование информации;&lt;/li&gt;
    &lt;li&gt;Начало 80-х — персональные компьютеры.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Распределенные системы&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b0/49/b04930f6-a878-46a0-90f9-031d8efe9702.png&quot; width=&quot;863&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Распределенные системы должны также относительно легко поддаваться расширению, или масштабированию. Эта характеристика является прямым следствием наличия независимых компьютеров, но в то же время не указывает, каким образом эти компьютеры на самом деле объединяются в единую систему.&lt;br /&gt; &lt;br /&gt;Распределенные системы обычно существуют постоянно, однако некоторые их части могут временно выходить из строя. Пользователи и приложения не должны уведомляться о том, что части системы заменены или починены или, что добавлены новые для поддержки дополнительных пользователей. &lt;br /&gt;&lt;br /&gt;Для того чтобы поддержать представление системы в едином виде, организация &lt;br /&gt;распределенных систем часто включает в себя дополнительный уровень программного обеспечения, находящийся между верхним уровнем, на котором находятся пользователи и приложения, и нижним уровнем, состоящим из операционных систем. &lt;/p&gt;
  &lt;h2&gt;Альтернативы распределения слоёв &lt;/h2&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ef/39/ef3938bd-c2a5-441d-b050-35962b9c782f.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Модели архитектуры «клиент-сервер»&lt;/h2&gt;
  &lt;p&gt;Модели отражают распределение слоёв между компьютерами сети&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Функции ввода и отображения данных (слой представления);&lt;/li&gt;
    &lt;li&gt;Прикладные функции, характерные для предметной области приложения (слой домена);&lt;/li&gt;
    &lt;li&gt;Функции накопления информации и управления данными (слой доступа к данным, слоев данных).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Модель RDA (модель «файл-сервер»)&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2f/ee/2fee1385-911b-46ae-a8b9-a91fd4d591f1.png&quot; width=&quot;1007&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Появились локальные сети. Файлы начали передаваться по сети. Сначала были одноранговые сети - все компьютеры равноправны. Возникла идея хранения всех общедоступных файлов на выделенном компьютере в сети - файл-сервере. &lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Файл-серверные приложения&lt;/strong&gt; — приложения, схожие по своей структуре с локальными &lt;br /&gt;приложениями и использующие сетевой ресурс для хранения данных. &lt;br /&gt;&lt;strong&gt;Функции сервера:&lt;/strong&gt; хранения данных и управление файлами. &lt;br /&gt;&lt;strong&gt;Функции клиента:&lt;/strong&gt; обработка данных происходит исключительно на стороне клиента. &lt;/p&gt;
  &lt;p&gt;Плюсы:  &lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Многопользовательский режим работы с данными;&lt;/li&gt;
    &lt;li&gt;Удобство централизованного управления доступом;&lt;/li&gt;
    &lt;li&gt;Низкая стоимость разработки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Минусы: &lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Низкая производительность;&lt;/li&gt;
    &lt;li&gt;Низкая надежность;&lt;/li&gt;
    &lt;li&gt;Слабые возможности расширения;&lt;/li&gt;
    &lt;li&gt;Проблемы многопользовательской работы с данными: последовательный доступ, отсутствие гарантии целостности.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Недостатки архитектуры с файловым сервером очевидны и вытекают главным &lt;br /&gt;образом из того, что данные хранятся в одном месте, а обрабатываются в другом. Это означает, что их нужно передавать по сети, что приводит к очень высоким нагрузкам на сеть и, вследствие этого, резкому снижению производительности приложения при увеличении числа одновременно работающих клиентов. Вторым важным недостатком такой архитектуры является децентрализованное решение проблем целостности и согласованности данных и одновременного доступа к данным. Такое решение снижает надежность приложения. &lt;/p&gt;
  &lt;h3&gt;Файл-сервер — распределение слоев&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ee/8c/ee8c1fd7-5b31-4c51-aa10-f6baf2b647e2.png&quot; width=&quot;741&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Модель DBS  (двухзвенная модель)&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/64/6b/646b4c98-ea30-4184-9b76-7e1bbc6a2203.png&quot; width=&quot;989&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Начало 90-х – архитектура «клиент-сервер».&lt;/p&gt;
  &lt;p&gt;Под «клиентом» обычно подразумевают компьютер конечного пользователя или программный код, выполняющий запрос к серверу (потребляющий услугу). «Сервером» обычно называют машину или программный код, предоставляющий сервис / отвечающий на запросы.&lt;/p&gt;
  &lt;p&gt;Ключевым отличием архитектуры клиент-сервер от архитектуры файл-сервер является &lt;br /&gt;абстрагирование от внутреннего представления данных (физической схемы данных). &lt;br /&gt;Теперь клиентские программы манипулируют данными на уровне логической схемы. &lt;/p&gt;
  &lt;p&gt;Основные особенности:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Клиентская программа работает с данными через запросы к серверному ПО;&lt;/li&gt;
    &lt;li&gt;Базовые функции приложения разделены между клиентом и сервером. &lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Плюсы:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Полная поддержка многопользовательской работы;&lt;/li&gt;
    &lt;li&gt;Гарантия целостности данных .&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Минусы:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Бизнес логика приложений осталась в клиентском ПО. При любом изменении &lt;br /&gt;алгоритмов, надо обновлять пользовательское ПО на каждом клиенте;&lt;/li&gt;
    &lt;li&gt;Высокие требования к пропускной способности коммуникационных каналов с сервером, что препятствует использование клиентских станций иначе как в &lt;br /&gt;локальной сети;&lt;/li&gt;
    &lt;li&gt;Слабая защита данных от взлома, в особенности от недобросовестных &lt;br /&gt;пользователей системы;&lt;/li&gt;
    &lt;li&gt;Высокая сложность администрирования и настройки рабочих мест пользователей системы;&lt;/li&gt;
    &lt;li&gt;Необходимость использовать мощные ПК на клиентских местах;&lt;/li&gt;
    &lt;li&gt;Высокая сложность разработки системы из-за необходимости выполнять бизнес-логику и обеспечивать пользовательский интерфейс в одной программе&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Итак, использование архитектуры клиент-сервер позволило создавать надежные (в смысле целостности данных) многопользовательские ИС с централизованной базой данных, независимые от аппаратной (а часто и программной) части сервера БД и поддерживающие графический интерфейс пользователя на клиентских станциях, связанных локальной сетью. Причем издержки на разработку приложений существенно сокращались. &lt;/p&gt;
  &lt;h3&gt;Модель DBS  (двухзвенная модель)&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/54/8b/548b4f42-0375-4c07-b372-00d07c44bfc7.png&quot; width=&quot;766&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Комплексный сервер (двухзвенная модель)&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/bf/30/bf30bbfb-b698-4d5f-b6c8-5e7fc886e7e1.png&quot; width=&quot;1018&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3&gt;Модель AS (трехзвенная модель)&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/23/c5/23c5ee21-9f15-460a-9804-be8f2a09fc3a.png&quot; width=&quot;1073&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Нетрудно заметить, что большинство недостатков классической или 2-х слойной &lt;br /&gt;архитектуры клиент-сервер проистекают от использования клиентской станции в качестве исполнителя бизнес-логики ИС. Поэтому очевидным шагом дальнейшей эволюции архитектур ИС явилась идея &amp;quot;тонкого клиента&amp;quot;, то есть разбиения алгоритмов обработки данных на части связанные с выполнением бизнес-функций и связанные с отображением информации в удобном для человека представлении. При этом на клиентской машине оставляют лишь вторую часть, связанную с первичной проверкой и отображением информации, перенося всю реальную функциональность системы на серверную часть.&lt;/p&gt;
  &lt;h3&gt;Трехзвенная архитектура&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/4a/9c/4a9cc073-0f74-45ac-8dbd-6f692d2f288b.png&quot; width=&quot;846&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Компоненты трехзвенной архитектуры, с точки зрения программного обеспечения реализуют определенные сервера БД, web-сервера и браузеры. Место любого из этих компонентов может занять программное обеспечение любого производителя.&lt;/p&gt;
  &lt;h3&gt;Преимущества сетевой архитектуры «Клиент-сервер»&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;На сервере порождается не конечная информация, а данные, подлежащие интерпретации компьютерами-клиентами;&lt;/li&gt;
    &lt;li&gt;Фрагменты прикладной системы распределены между компьютерами сети;&lt;/li&gt;
    &lt;li&gt;для обмена данными могут использоваться закрытые протоколы;&lt;/li&gt;
    &lt;li&gt;каждый компьютер в сети ориентирован на выполнение только своих локальных программ за счёт этого исключается миграция программ по сети и снижается вероятность запуска вредоносных программ и заражения вирусами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Недостатки архитектуры «клиент-сервер» с точки зрения информационной безопасности&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;территориальная распределенности компонентов системы усложняет администрирование;&lt;/li&gt;
    &lt;li&gt;часть ресурсов может располагаться на локальных компьютерах, которые характеризуются повышенной уязвимостью;&lt;/li&gt;
    &lt;li&gt;использование для обмена данными закрытых протоколов требует разработки уникальных средств защиты;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Архитектура «клиент-сервер» на базе технологии Web&lt;/h3&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/d2/c8/d2c8e8e5-b6f9-4cfa-ad9c-cbfca0d9cd0b.png&quot; width=&quot;1188&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>ngrigorev:IntroductionToInformationSystemArchitecture</id><link rel="alternate" type="text/html" href="https://teletype.in/@ngrigorev/IntroductionToInformationSystemArchitecture?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ngrigorev"></link><title>Введение в АрхИС</title><published>2020-09-02T20:54:28.655Z</published><updated>2020-09-08T09:26:57.627Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/24/dd/24dd4186-32c2-433a-b421-8b5ee0eeae1c.png"></media:thumbnail><category term="topic14018" label="Курс АрхИС"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/d7/68/d768f880-4170-4e1f-9114-4f3ce0d87c3a.png&quot;&gt;Получить теоретические знания о том, что такое архитектура информационных систем, почему это важно, как проектируются архитектуры; а также лучшие практики в создании архитектур.
Получить практический опыт в разработке архитектуры, выполнив ряд практических работ и завершив курсовой проект, познать все тяготы архитектора.</summary><content type="html">
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/d7/68/d768f880-4170-4e1f-9114-4f3ce0d87c3a.png&quot; width=&quot;896&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/66/1e/661e00d0-242d-42ff-9d38-6101077612f2.png&quot; width=&quot;450&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2&gt;Цель&lt;/h2&gt;
  &lt;p&gt;Получить теоретические знания о том, что такое архитектура информационных систем, почему это важно, как проектируются архитектуры; а также лучшие практики в создании архитектур.&lt;br /&gt;Получить практический опыт в разработке архитектуры, выполнив ряд практических работ и завершив &lt;strong&gt;курсовой проект&lt;/strong&gt;, познать все тяготы архитектора.&lt;/p&gt;
  &lt;h2&gt;Задача курса&lt;/h2&gt;
  &lt;ol&gt;
    &lt;li&gt;Иметь представление о роли информационных систем в производстве (организации) во взаимосвязи с архитектурой предприятия&lt;/li&gt;
    &lt;li&gt;Знать и применять на практике&lt;/li&gt;
  &lt;/ol&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;em&gt;методы анализа требований для формирования высокоуровневой архитектуры ИС;&lt;/em&gt;&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;архитектуры информационных систем;&lt;/em&gt;&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;методы проектирования информационных систем в целом и их компонентов;&lt;/em&gt;&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;современные средства реализации информационных систем.&lt;/em&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Базовые знания/навыки для курса&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;Основные понятия: система, ИС, ИТ, АИС, классификация ИС и др.;&lt;/li&gt;
    &lt;li&gt;Исследование и структурное моделирование предметной области. Понятие бизнес-процесса. Формулирование требований к системам;&lt;/li&gt;
    &lt;li&gt;ООП. Построение объектно-ориентированных моделей предметной области;&lt;/li&gt;
    &lt;li&gt;Построение UI и/или разработка приложений, ориентированных на Веб;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Источники информации и знаний&lt;/h2&gt;
  &lt;p&gt;Теория&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Иан Соммервилл, Инженерия ПО;&lt;/li&gt;
    &lt;li&gt;Д. Р. Трутнев, Архитектура ИС. Основы проектирования;&lt;/li&gt;
    &lt;li&gt;Б. Ю. Гриценко, Архитектура предприятия.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Практика&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Мартин Фаулер, Шаблоны корпоративный приложений;&lt;/li&gt;
    &lt;li&gt;Руководство Microsoft по проектированию архитектуры приложений;&lt;/li&gt;
    &lt;li&gt;Эрик Эванс, Предметно-ориентирование проектирование (DDD);&lt;/li&gt;
    &lt;li&gt;Л. А. Мацяшнек, Б. Л. Лионг, Практическая программная инженерия.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Статьи&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://habr.com/&quot; target=&quot;_blank&quot;&gt;Habr;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://proglib.io/&quot; target=&quot;_blank&quot;&gt;Библиотека программиста.&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Инструменты и технологии&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;IDE: &lt;strong&gt;Visual Studio 2019;&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;Text editor: &lt;strong&gt;Visual Studio Code&lt;/strong&gt;/Subline/Atom или другой;&lt;/li&gt;
    &lt;li&gt;Terminal: &lt;strong&gt;WindowsTerminal&lt;/strong&gt;/CommandLine/PowerShell или другой;&lt;/li&gt;
    &lt;li&gt;VCS &lt;em&gt;(Version Control System):&lt;/em&gt; &lt;strong&gt;GIT;&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;.NET &lt;em&gt;(.NET Core last version, .NET Framework last version)&lt;/em&gt;;&lt;/li&gt;
    &lt;li&gt;CASE &lt;em&gt;(набор &lt;strong&gt;инструментов&lt;/strong&gt; и методов программной инженерии для проектирования ПО):&lt;/em&gt; &lt;strong&gt;Visual Paradigm&lt;/strong&gt;, Draw.io, MS Visio.&lt;/li&gt;
  &lt;/ul&gt;

</content></entry></feed>