Programacao Web
Programacao Web
Programacao Web
FICHA 1:
Conteúdo
ASP. NET
O ASP.NET é baseado no Framework .NET herdando todas as suas características, por isso, como
qualquer aplicação .NET, as aplicações para essa plataforma podem ser escritas em várias linguagens,
como C#, F# e Visual Basic.NET.
O ASP.NET Core é uma estrutura de software livre, multiplataforma, para a criação de aplicativos Web
modernos e baseados em nuvem, no Windows, no macOS ou no Linux.
Seleção de estrutura
ASP.NET Core ASP.NET 4.x
Build para Windows, macOS ou Linux Build para Windows
Razor Páginas é a abordagem recomendada para criar uma Usar Web Forms, SignalR , MVC,
interface do usuário da Web a partir do ASP.NET Core 2. x. API da Web, WebHooksou
Consulte também MVC, API da Webe SignalR . páginas da Web
Várias versões por computador Uma versão por computador
Desenvolva com o Visual Studio, Visual Studio para Mac ou Desenvolva com o Visual Studio
Visual Studio Code usando C# ou F# usando C#, vb ou F #
Desempenho superior ao do ASP.NET 4.x Bom desempenho
Use o runtime do .NET
Usar o runtime do .NET Core
Framework
MVC?
Na arquitetura MVC o modelo representa os dados da aplicação e as regras do negócio que governam o
acesso e a modificação dos dados. O modelo mantém o estado persistente do negócio e fornece ao
controlador a capacidade de aceder as funcionalidades da aplicação encapsuladas pelo próprio modelo.
Com base na ação do usuário e no resultado do processamento do modelo, o controlador seleciona uma
visualização a ser exibida como parte da resposta a solicitação do usuário. Há normalmente um
controlador para cada conjunto de funcionalidades relacionadas.
A arquitetura de 3 camadas que esta representada abaixo é uma implementação do modelo MVC. O
modelo MVC esta preocupado em separar a informação de sua apresentação.
ASP.NET MVC
Algumas aplicações Web podem se beneficiar do framework MVC, enquanto outras podem continuar a
usar o padrão tradicional ASP.NET, que é baseado em Web Forms e postbacks. Nenhuma abordagem,
seja MVC ou Web Forms, exclui a outra, podendo inclusive serem utilizadas ao mesmo tempo.
Vantagens:
• Como o modelo MVC gerencia múltiplos visualizadores usando o mesmo modelo é fácil manter,
testar e atualizar sistemas múltiplos;
• É muito simples incluir novos clientes apenas incluindo seus visualizadores e controles;
• Torna a aplicação escalável;
• É possível ter desenvolvimento em paralelo para o modelo, visualizador e controle, pois são
independentes;
• É mais fácil gerenciar a complexidade da aplicação dividindo-a em modelo, visualizador e
controlador (MVC);
Desvantagens:
Paradigmas de programação
• Orientado a objetos (C++, Object Pascal, Java (< 8), C# (< 3))
• Lógico (Prolog)
Transparência referencial
Uma função possui transparência referencial se seu resultado for sempre o mesmo
Isso significa que funções podem, por exemplo, serem passadas como parâmetros de métodos, bem
como retornadas como resultado de métodos.
Class Program {
static int CompareProducts(Product p1, Product p2) {
return p1.Name.ToUpper().CompareTo(p2.Name.ToUpper());
}
static void Main(string[] args) {
List<Product> list = new List<Product>();
list.Add(new Product("TV", 900.00));
list.Add(new Product("Notebook", 1200.00));
list.Add(new Product("Tablet", 450.00));
list.Sort(CompareProducts);
(...)
Inferência de tipos
int sum = 0;
foreach (int x in list) {
sum += x;
}
VS
Em programação funcional, expressão lambda corresponde a uma função anônima de primeira classe.
Uma expressão Lambda é uma função anônima que você pode usar para criar delegates ou tipos de
árvore de expressão. Ao usar expressões lambda, você pode escrever funções locais que podem ser
passadas como argumentos ou retornadas como o valor de chamadas de função. Essas expressões são
particularmente úteis para escrever expressões de consulta LINQ.
class Program {
static int CompareProducts(Product p1, Product p2) {
return p1.Name.ToUpper().CompareTo(p2.Name.ToUpper());
}
static void Main(string[] args) {
(...)
list.Sort(CompareProducts);
list.Sort((p1, p2) => p1.Name.ToUpper().CompareTo(p2.Name.ToUpper()));
(...)
Nota: Delegates permitem que uma classe use métodos de outra classe.
Assim, as expressões lambdas são funções ou rotinas, sem nome, que calculam e retornam um valor
único; elas podem ser usadas em qualquer lugar que um tipo delegate for válido.
Na linguagem C# todas as expressões lambda usam o operador lambda =>, que é lido como "vai para". O
lado esquerdo do operador lambda especifica os parâmetros de entrada (se houver) e o direito contém
a expressão ou o bloco de instruções A expressão lambda x => x * x é lida assim : " x recebe x vezes x. "
Delegates
• É um tipo referência
Usos comuns:
Demo
namespace Course.Services {
class CalculationService {
public static double Max(double x, double y) {
return (x > y) ? x : y;
}
public static double Sum(double x, double y) {
return x + y;
}
public static double Square(double x) {
return x * x;
}
}
}
Demo
using System;
using Course.Services;
namespace Course {
delegate double BinaryNumericOperation(double n1, double n2);
class Program {
static void Main(string[] args) {
double a = 10;
double b = 12;
// BinaryNumericOperation op = CalculationService.Sum;
BinaryNumericOperation op = new BinaryNumericOperation(CalculationService.Sum);
// double result = op(a, b);
double result = op.Invoke(a, b);
Console.WriteLine(result);
}
}
}
Multicast delegates
Demo
using System;
using System;
using Course.Services;
namespace Course {
delegate void BinaryNumericOperation(double n1, double n2);
class Program {
static void Main(string[] args) {
double a = 10;
double b = 12;
BinaryNumericOperation op = CalculationService.ShowSum;
op += CalculationService.ShowMax;
op(a, b);
}
}
}
Delegates pré-definidos
• Action
• Func
• Predicate
Predicate (System)
• https://msdn.microsoft.com/en-us/library/bfcke1bz%28v=vs.110%29.aspx
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, remova da lista somente aqueles cujo preço
mínimo seja 100.
using System;
using ExpressoesLambda.Entities;
namespace ExpressoesLambda
{
class Program
{
foreach(Product p in list)
{
Console.WriteLine(p);
}
}
public static bool ProductTest(Product p)
{
return p.Price >= 100.0;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace ExpressoesLambda.Entities
{
class Product
{
public string Name { get; set; }
public double Price { get; set; }
Action (System)
• https://msdn.microsoft.com/en-us/library/system.action%28v=vs.110%29.aspx
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, aumente o preço dos produtos em 10%.
using System;
using ExpressoesLambda.Entities;
using System.Collections.Generic;
namespace ExpressoesLambda
{
class Program
{
foreach(Product p in list)
{
Console.WriteLine(p);
}
}
//deve-se eliminar esta função caso fosse usar o código com lambda comentado acima
static void UpdatePrice (Product p)
{
p.Price += p.Price * 0.1;
}
}
}
Func (System)
https://msdn.microsoft.com/en-us/library/bb534960%28v=vs.110%29.aspx
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, gere uma nova lista contendo os
nomes dos produtos em caixa alta.
using System;
using ExpressoesLambda.Entities;
using System.Collections.Generic;
using System.Linq;
namespace ExpressoesLambda
{
class Program
{
//usando um delegate
//Func<Product, string> func = NameUpper;
//List<string> result = list.Select(func).ToList();
foreach(string s in result)
{
Console.WriteLine(s);
}
}
static string NameUpper (Product p)
{
return p.Name.ToUpper();
}
}
}
• removeAll(Predicate)
• ForEach(Action)
• Select(Func)
Exercícios:
Fazer um programa que, a partir de uma lista de produtos, calcule a soma dos preços somente dos
produtos cujo nome começa com "T".
Resultado: 1250.50
Introdução ao LINQ
• Namespace: System.Linq
• Possui diversas operações de consulta, cujos parâmetros tipicamente são expressões lambda ou
expressões de sintaxe similar à SQL.
• https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/index
• Definir a query
Demo
Operações do LINQ
• Grouping: GroupBy
• https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b/view/SamplePack/1?sortBy=Popularity
• https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b/view/SamplePack/2?sortBy=Popularity
• https://odetocode.com/articles/739.aspx
Classe Category
using System;
using System.Collections.Generic;
using System.Text;
namespace ExpressoesLambda.Entities
{
class Category
{
public int Id { get; set; }
public string Name { get; set; }
public int Tier { get; set; }
}
}
Classe Product
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
namespace ExpressoesLambda.Entities
{
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public Category Category { get; set; }
using System;
using ExpressoesLambda.Entities;
using System.Collections.Generic;
using System.Linq;
namespace ExpressoesLambda
{
class Program
{
static void Print<T>(string message, IEnumerable<T> collection)
{
Console.WriteLine(message);
foreach(T obj in collection)
{
Console.WriteLine(obj);
}
Console.WriteLine();
}
static void Main(string[] args)
{
Category c1 = new Category() { Id = 1, Name = "Tools", Tier = 2 };
Category c2 = new Category() { Id = 2, Name = "Computers", Tier = 1 };
Category c3 = new Category() { Id = 3, Name = "Electronics", Tier = 1 };
};
//Poderiamos ter usado este trecho de codigo, mas por questoes de economia de codigo
//usamos uma funcao que faz a impressao e apenas chamamos a funcao em cada resultado
//Console.WriteLine("TIER 1 AND PRICE < 900:");
//foreach(Product x in r1)
//{
// Console.WriteLine(x);
//}
var r1 = products.Where(p => p.Category.Tier == 1 && p.Price < 900.0);
Print("TIER 1 AND PRICE < 900:", r1);
var r3 = products.Where(p => p.Name[0] == 'C').Select(p => new { p.Name, p.Price, CategoryName = p.Category.Name });
Print("NAMES STARTED WITH 'C' AND ANONYMOUS OBJECT", r3);
var r5 = r4.Skip(2).Take(4);
Print("TIER 1 ORDER BY PRICE THEN BY NAME SKIP 2 TAKE 4", r5);
var r6 = products.FirstOrDefault();
Console.WriteLine("First test1: "+r6);
var r7 = products.Where(p => p.Price > 3000.0).FirstOrDefault();
}
}